Avatar billede jfki Nybegynder
18. oktober 2007 - 10:20 Der er 6 kommentarer og
1 løsning

Sotering af husnumre rækkefølge

Hej.

Jeg har en tabel i en Oracle DB indeholdende husnumre (string). Husnumrene kan både hedde 1, 1A mm. Dem vil jeg gerne have sorteret således, at 11,12, etc. ikke kommer før 1,2,3 etc, og 1A kommer før 2,3,4,5

Hvordan kan jeg nemmest gøre dette??
Avatar billede holdam Nybegynder
18. oktober 2007 - 10:36 #1
SELECT husnr, LPAD(TRANSLATE(husnr, '@abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ', '@'), 10, '0')
FROM <tabel>
ORDER BY LPAD(TRANSLATE(husnr, '@abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ', '@'), 10, '0'), LENGTH(husnr);
Avatar billede jfki Nybegynder
18. oktober 2007 - 11:01 #2
Damn - det virker

Kan du evt. forklare hvad du præcis gør?
Avatar billede holdam Nybegynder
18. oktober 2007 - 11:12 #3
Jamen det er da helt selvforklarende :-)

Husnummeret omformes til en streng af fast længde (her 10 tegn) hvor der indsættes foranstillede nummer. Det sørger LPAD for. På den måde sikres det at 2 og 3 kommer før 11 og 12.

Men da du har husbogstavet i samme felt som husnummeret, skal der lidt mere gymnastik til. TRANSLATE-kommandoen fjerner alle bogstaver, både små og store, fra husnr-feltet inden der sættes LPAD på. På den måde sorteres 1A før 2. Normalt vil man så have husbetegnelser med bogstaver efter dem uden - altså 1A efter 1 - derfor sorteres der på to kriterier, først LPAD(TRANSLATE(...)), derefter LENGTH. Det tager sig af den sidste del.
Avatar billede jfki Nybegynder
18. oktober 2007 - 11:18 #4
Okay nu giver det mening..

Hvad hvis jeg så har et husnummer der eks. hedder 1AB, 1DA - går det så godt??
Avatar billede holdam Nybegynder
18. oktober 2007 - 11:42 #5
Både ja og nej. 1AB og 1DA vil blive sorteret efter 1 og før 2, men du kan ikke være sikker på rækkefølgen - f.eks. kan 1DA godt komme før 1AB afhængig af hvilken rækkefølge de hentes op fra databasen.

Du kan evt. udvide ORDER BY udtrykket til:

ORDER BY LPAD(TRANSLATE(husnr, '@abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ', '@'), 10, '0'), LENGTH(husnr), UPPER(husnr)

- altså tilføje et UPPER(husnr) som tredje sorteringskriterium - så skulle der være taget højde for sådanne husnumre også (UPPER er for at sikre at a og A sorteres sammen og før b og B)
Avatar billede jfki Nybegynder
18. oktober 2007 - 11:51 #6
Super - mange tak for hjælpen

Ligger du et svar?
Avatar billede holdam Nybegynder
18. oktober 2007 - 12:09 #7
Ok - her er et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester