Avatar billede kbirk Nybegynder
24. august 2007 - 11:11 Der er 9 kommentarer og
2 løsninger

ORDER BY på felt med bogstaver og tal

Hejsa
Jeg skal lave en sortering på et felt som både har bogstaver og tal(feks. "test 25"), og dette giver mig nogle problemer. Når jeg gør følgende:
select * from ct_contact where ct_name1 like 'test%' order by ct_name1
Får jeg denne sortering ud:
Test 1
Test 10
Test 11
Test 12
Test 13
Test 14
Test 15
Test 16
Test 17
Test 18
Test 19
Test 2
Test 20
Test 21
Test 22
Test 3
Test 4
Test 5
Test 6
Test 7
Test 8
Test 9

Og jeg ønsker:
Test 1
Test 2
Test 3
...
Test 9
Test 10
Test 11
...
Test 19
Test 20
Test 21

Hvad gør jeg galt.. Det er sikkert temlig simpelt..
Avatar billede bennytordrup Nybegynder
24. august 2007 - 11:21 #1
Så længe, du har defineret feltet som alfanumerisk, kan du ikke komme ud over dette uden større krumspring.

Den alfanumeriske sortering giver nemlig nøjagtig den sortering.

Hvis du altid har feltet bygget op med "Test <tal>", kan du lave et beregnet felt, som klipper "Test " fra og omdanner resten til numerisk og derefter sortere på dette. Alternativt er at lave et felt med sorteringsnøgle og vedligeholde dette også.
Avatar billede fsconsult.dk Nybegynder
24. august 2007 - 11:23 #2
det tror jeg ikke umiddelbart du kan, medmindre du VED at teksten fra position 6 og fremefter består af tal, da det ellers er en korrekt sortering MySQL laver.

Alternativt kan du bruge "Test 01" istedet for "Test 1" (evt. "Test  1").
Avatar billede pierrehusted Nybegynder
24. august 2007 - 11:23 #3
Da feltet er alfanumerisk (blandet tal og tegn), så får du sorteringen alfanumerisk - altså et tegn ad gangen, begyndende fra venstre side.

Jeg ser to muligheder:
- Du kan ændre i de data der sorteres på.
- Du kan ændre i sorteringen.

.
Hvis du vil/kan ændre i data der sorteres på, så skal du sørge for at der er foranstillede nuller - d.v.s. "Test 1" bliver til "Test 01".
Du skal sørge for at have så mange foranstillede nuller som der "nogensinde" kan blive brug for tal.

.
Hvis du vil ændre i sorteringen, så kræver det at du ved hvad der står i feltet af tekst. Hvis der altid står "Test " foran, så er det nemt:
ORDER BY REPLACE(ct_name1, 'Test ', '')

Ved du ikke hvilke tekst-stumper der ligger i feltet, så er det straks sværere. Så skal man måske lave noget med at fjerne alle tal...  Nej, det bliver nok noget underligt noget.
Avatar billede nemlig Professor
24. august 2007 - 11:23 #4
Samme problemstillinger ser man i mange andre programmer.
Jeg plejer at navngive på denne måde:
Test 01
Test 02
Test 03

osv.


Så virker det.
Avatar billede kbirk Nybegynder
24. august 2007 - 11:26 #5
Første idé er ikke så god for det er nemlig meget blandet hvad indholdet er..
Avatar billede kbirk Nybegynder
24. august 2007 - 11:28 #6
Jeg kan ikke komme til at manipulerer med dataene.. Jeg tror sku jeg bliver nødt til at bruge det som det er så..

Så i mener altså at det ikke er noget man kan komme uden om med sql..?

Kan i ikke give et svar alle sammen så deler i bare pointene for at svarer..
Avatar billede nemlig Professor
24. august 2007 - 11:32 #7
Jeg hopper over.
Avatar billede bennytordrup Nybegynder
24. august 2007 - 11:33 #8
muligheden med ORDER BY Replace..... giver heller ikke det ønskede. resultatet af Replace er stadig alfanumerisk.
Avatar billede pierrehusted Nybegynder
24. august 2007 - 11:37 #9
Ja ok, det glemte jeg. Så kan man måske gøre sådan her:

ORDER BY CONVERT(integer, REPLACE(ct_name1, 'Test ', ''))

Men det bliver nok lidt tungt. Og det vil gå galt hvis der står noget andet end "Test ##".
Avatar billede nemlig Professor
24. august 2007 - 11:38 #10
Kan du ikke lave et lille script, der lige kører alle poster igennem og tilretter feltet. Såfremt der står et 1-cifret tal, skal der sættes et 0 foran.
Og hvis du har høje tal, fx. op til 999, så skal der sættes 2 nuller foran 1-cifrede tal og 1 nul foran 2-cifrede tal.
Avatar billede kbirk Nybegynder
24. august 2007 - 12:05 #11
Ja jeg tror ikke den går for i de fleste tilfælde vil der slet ikke være et tal. Så jeg tror jeg lever med sorteringen som den er nu.. Eller mange tak for forslagene..
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