18. oktober 2007 - 10:20Der 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
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.
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)
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.