| FAQ |
| Kalender |
|
|
#1 | ||
|
|||
|
Mycket flitig postare
|
hej,
jag har en liten problem som jag måste lösa, har nu suttit i någon timme utan att lyckas.. databasen ser ut på detta vis. id postnr 1 75000-76000 2 11655-11660 3 77998 4 45770 det jag vill göra är att skriva en query som först kollar ifall cellen innehåller bindestäck, om ja, ska den kolla ifall den finns med i intervallet. om den inte innehåller bindesträck så ska den bara ta det postnummer som matchar. |
||
|
|
Svara med citat
|
|
|
#2 | ||
|
|||
|
Supermoderator
|
Du har lagt upp databasen lite galet, intervall bör du spara i två olika fält. Om du inte kan ändra så får du använda substring (postnumren har alltid samma format) men det blir ingen effektiv fråga.
__________________
Full-stack developer, free for smaller assignments Senast redigerad av tartareandesire den 2013-02-01 klockan 15:04 |
||
|
|
Svara med citat
|
|
|
#3 | |||
|
||||
|
Mycket flitig postare
|
Frågan är väl, måste databasen verkligen se ut sådär?
|
|||
|
|
Svara med citat
|
|
|
#4 | ||
|
|||
|
Mycket flitig postare
|
ja, db måste se ut så, eftersom resten av systemet är byggd så, och tänker inte sätta mig i den koden och rådda om....
|
||
|
|
Svara med citat
|
|
|
#5 | |||
|
||||
|
Mycket flitig postare
|
En fullösning vore att ha ett script som gör en kopia på den tabellen och då lägger upp fälten så som de ska vara (för att kunna genomföra en okej sökning).
Annars har jag svårt att tänka mig någon query som löser det du söker.. |
|||
|
|
Svara med citat
|
|
|
#6 | ||
|
|||
|
Mycket flitig postare
|
ok tackar för svaret... det var bara det jag ville veta...
trodde jag kunde lösa det endast med hjälp av en query..
|
||
|
|
Svara med citat
|
|
|
#7 | |||
|
||||
|
Mycket flitig postare
|
Nu är inte jag SQL-expert.
tartareandesire har kanske någon lösning, som han nämnde ovan? |
|||
|
|
Svara med citat
|
|
|
#8 | ||
|
|||
|
Supermoderator
|
Du kan använda substring som sagt var:
Kod:
SELECT * FROM [tabell] WHERE postnr LIKE '%-%' AND SUBSTR(postnr, 1, 5) <= '75005' AND SUBSTR(postnr, 7, 5) >= '75005' Edit: Det var alltså sql-frågan som var usel, inte din fråga
__________________
Full-stack developer, free for smaller assignments Senast redigerad av tartareandesire den 2013-02-01 klockan 16:52 |
||
|
|
Svara med citat
|
|
|
#9 | ||
|
|||
|
Klarade millennium-buggen
|
Först skapar vi databasstrukturen med DDL-script...
Kod:
delimiter $$ CREATE TABLE `naak2803postnrarea` ( `id` int(11) NOT NULL AUTO_INCREMENT, `postnr` varchar(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1$$ Kod:
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('1', '75000-76000');
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('2', '11655-11660');
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('3', '77998');
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('4', '45770');
Kod:
-- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stored by the server -- -------------------------------------------------------------------------------- DELIMITER $$ CREATE PROCEDURE `wn`.`GetPostnrArea`(IN pnr VARCHAR(5)) BEGIN SELECT * FROM `wn`.`naak2803PostnrArea` WHERE postnr LIKE '%-%' AND SUBSTR(postnr, 1, 5) <= pnr AND SUBSTR(postnr, 7, 5) >= pnr UNION SELECT * FROM `wn`.`naak2803PostnrArea` WHERE SUBSTR(postnr, 1, 5) = pnr; END Kod:
delimiter $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetPostnrAreaTest`()
BEGIN
call `wn`.`GetPostnrArea`('75005'); -- Area 1 75000-76000
call `wn`.`GetPostnrArea`('11657'); -- Area 2 11655-11660
call `wn`.`GetPostnrArea`('77998'); -- Area 3 77998
call `wn`.`GetPostnrArea`('45770'); -- Area 4 45770
call `wn`.`GetPostnrArea`('55555'); -- No area
SELECT 'Tartaren' as code, x.*
FROM wn.naak2803PostnrArea x
WHERE postnr LIKE '%-%'
AND SUBSTR(postnr, 1, 5) <= '75005'
AND SUBSTR(postnr, 7, 5) >= '75005';
END$$
Kod:
call `wn`.`GetPostnrAreaTest`(); Jag har utgått från tartarens grundlösning och kompletterat den efter vad jag tror är den fullkomliga lösningen av problemdefinitionen. Jag håller dock med Tartaren och andra i tråden om att datamodellen inte är normaliserad ens med 1NF (Första normalformen) då postnr-kolumnen inte är atomär. Det i sig gör det extremt svårt att bygga en effektiv lösning. Risken för bristande datakvalitet är uppenbar. Senast redigerad av Conny Westh den 2013-02-01 klockan 23:40 |
||
|
|
Svara med citat
|
| Svara |
|
|