|
| Sortere tekst med tal Fra : Joe |
Dato : 10-01-11 06:01 |
|
Hvis jeg har følgende stående i min database - i den rækkefølge:
Test Hest 10
Test Hest 9
Test Hest 08
Ja da 100
Ja da 008
Har jeg på nogen måde mulighed for at få det sorteret korrekt således,
at den også tager højde for tallene? Teksten og tallene kan være af
variabel længde.
Ja da 008
Ja da 100
Test Hest 08
Test Hest 9
Test Hest 10
Det er på en MSSQL2000 så jeg er desværre ikke optimistisk :-/
| |
Lars Kongshøj (10-01-2011)
| Kommentar Fra : Lars Kongshøj |
Dato : 10-01-11 14:16 |
|
Den 10/01/11 14.01, Joe skrev:
> Hvis jeg har følgende stående i min database - i den rækkefølge:
Data ligger per definition ikke ordnet i en relationsdatabase (at de
naturligvis har en ordning i den praktiske implementation er en anden sag).
> Test Hest 10
> Test Hest 9
> Test Hest 08
> Ja da 100
> Ja da 008
>
> Har jeg på nogen måde mulighed for at få det sorteret korrekt således,
> at den også tager højde for tallene? Teksten og tallene kan være af
> variabel længde.
>
> Ja da 008
> Ja da 100
> Test Hest 08
> Test Hest 9
> Test Hest 10
Det kan du da sagtens.
Men:
Det ser ud til at din database er fejldesignet. Det rigtige vil være at
splittet feltet op i et tekstfelt og et løbenummrfelt. De foranstillede
0'er antyder at det ikke er et talfelt.
Hvis det ikke kan lade sig gøre at normalisere databasen må du lave
noget klamphuggeri med et beregnet udtryk i order by klausulen,
> Det er på en MSSQL2000 så jeg er desværre ikke optimistisk :-/
Man ligger som man reder.
Mvh. Lars
| |
Joe (10-01-2011)
| Kommentar Fra : Joe |
Dato : 10-01-11 06:36 |
|
> > Hvis jeg har f lgende st ende i min database - i den r kkef lge:
>
> Data ligger per definition ikke ordnet i en relationsdatabase (at de
> naturligvis har en ordning i den praktiske implementation er en anden sag).
>
> > Test Hest 10
> > Test Hest 9
> > Test Hest 08
> > Ja da 100
> > Ja da 008
>
> > Har jeg p nogen m de mulighed for at f det sorteret korrekt s ledes,
> > at den ogs tager h jde for tallene? Teksten og tallene kan v re af
> > variabel l ngde.
>
> > Ja da 008
> > Ja da 100
> > Test Hest 08
> > Test Hest 9
> > Test Hest 10
>
> Det kan du da sagtens.
>
> Men:
> Det ser ud til at din database er fejldesignet. Det rigtige vil v re at
> splittet feltet op i et tekstfelt og et l benummrfelt. De foranstillede
> 0'er antyder at det ikke er et talfelt.
Nej, der skal ikke både være tekst og tal felter, da navnet kan være
hvad som helst - f.eks. også "1 Test", "Test 1 Hest", "Test 1" osv.
osv.
> Hvis det ikke kan lade sig g re at normalisere databasen m du lave
> noget klamphuggeri med et beregnet udtryk i order by klausulen,
>
> > Det er p en MSSQL2000 s jeg er desv rre ikke optimistisk :-/
>
> Man ligger som man reder.
Nu er det vel ikke alle der bare kan skifte database uden videre - jeg
bruger den database der ér til formålet og så må jeg jo bruge de
metoder der skal til for at løse opgaven.
Jeg er kommet frem til, at jeg i vores tilfælde kan bruge en "ORDER BY
LEN(field), field". Det er ikke den helt perfekte løsning, men vi vil
typisk have grupperet vores tekst på en måde, så det er acceptabelt.
Hvis nogen kender den "rigtige" løsning vil jeg selvfølgelig stadigt
gerne vide hvordan, men jeg tror det vil være, at lave efterbehandling
i ASP'en bagvedliggende (det køre via en webside).
| |
Lars Kongshøj (10-01-2011)
| Kommentar Fra : Lars Kongshøj |
Dato : 10-01-11 15:07 |
|
Den 10/01/11 14.36, Joe skrev:
> Jeg er kommet frem til, at jeg i vores tilfælde kan bruge en "ORDER BY
> LEN(field), field". Det er ikke den helt perfekte løsning, men vi vil
> typisk have grupperet vores tekst på en måde, så det er acceptabelt.
> Hvis nogen kender den "rigtige" løsning vil jeg selvfølgelig stadigt
> gerne vide hvordan, men jeg tror det vil være, at lave efterbehandling
> i ASP'en bagvedliggende (det køre via en webside).
Det er længe siden at jeg har bandet og svovlet over SQL-server, men kan
du ikke definere en funktion, der normaliserer feltet, så det kan
sorteres, og så kalde den i order by? Eller værre endnu: danne et
sorteringsfelt i tabellen. Databasen er i modsætning til procedurale
sprog beregnet til sortering.
Jeg vil stadig ikke kalde det den rigtige løsning, men den må være bedre
end dit forslag, det vil jo ikke sortere "Test Hest 9" rigtigt i dit
eksempel.
Den "rigtige" løsning er at designe databasen, så den i størst muligt
afspejler datastrukturen, den måde data anvendes på, og overholder så
mange normalformer som praktisk muligt.
Mvh. Lars
| |
Leif Neland (10-01-2011)
| Kommentar Fra : Leif Neland |
Dato : 10-01-11 18:27 |
|
Jeg cc'er lige denne til dk.edb.system.unix, med fut tilbage til
dk.edb.database
Kan man med en regex erstatte alle forekomster af tal med det samme tal
i fast bredde?
Hvis man antager at 6 cifre er nok
1 gris har 4 ben
2 grise har 8 ben
10 grise har 40 ben
10 tusindben har 1000 ben
skal (\d*) expanderes til 6 cifre (med foranstillede nuller for
læselighedens skyld:
000001 gris har 000004 ben
000002 grise har 000008 ben
000010 grise har 000040 ben
000010 tusindben har 001000 ben
Dette skal bruges til at sortere "naturligt" i nedenstående:
Den 10-01-2011 15:06, Lars Kongshøj skrev:
> Den 10/01/11 14.36, Joe skrev:
>> Jeg er kommet frem til, at jeg i vores tilfælde kan bruge en "ORDER BY
>> LEN(field), field". Det er ikke den helt perfekte løsning, men vi vil
>> typisk have grupperet vores tekst på en måde, så det er acceptabelt.
>> Hvis nogen kender den "rigtige" løsning vil jeg selvfølgelig stadigt
>> gerne vide hvordan, men jeg tror det vil være, at lave efterbehandling
>> i ASP'en bagvedliggende (det køre via en webside).
>
> Det er længe siden at jeg har bandet og svovlet over SQL-server, men kan
> du ikke definere en funktion, der normaliserer feltet, så det kan
> sorteres, og så kalde den i order by? Eller værre endnu: danne et
> sorteringsfelt i tabellen. Databasen er i modsætning til procedurale
> sprog beregnet til sortering.
>
| |
Arne Vajhøj (12-01-2011)
| Kommentar Fra : Arne Vajhøj |
Dato : 12-01-11 04:16 |
|
On 10-01-2011 12:27, Leif Neland wrote:
> Den 10-01-2011 15:06, Lars Kongshøj skrev:
>> Den 10/01/11 14.36, Joe skrev:
>>> Jeg er kommet frem til, at jeg i vores tilfælde kan bruge en "ORDER BY
>>> LEN(field), field". Det er ikke den helt perfekte løsning, men vi vil
>>> typisk have grupperet vores tekst på en måde, så det er acceptabelt.
>>> Hvis nogen kender den "rigtige" løsning vil jeg selvfølgelig stadigt
>>> gerne vide hvordan, men jeg tror det vil være, at lave efterbehandling
>>> i ASP'en bagvedliggende (det køre via en webside).
>>
>> Det er længe siden at jeg har bandet og svovlet over SQL-server, men kan
>> du ikke definere en funktion, der normaliserer feltet, så det kan
>> sorteres, og så kalde den i order by? Eller værre endnu: danne et
>> sorteringsfelt i tabellen. Databasen er i modsætning til procedurale
>> sprog beregnet til sortering.
> Kan man med en regex erstatte alle forekomster af tal med det samme tal
> i fast bredde?
>
> Hvis man antager at 6 cifre er nok
> 1 gris har 4 ben
> 2 grise har 8 ben
> 10 grise har 40 ben
> 10 tusindben har 1000 ben
> skal (\d*) expanderes til 6 cifre (med foranstillede nuller for
> læselighedens skyld:
> 000001 gris har 000004 ben
> 000002 grise har 000008 ben
> 000010 grise har 000040 ben
> 000010 tusindben har 001000 ben
>
> Dette skal bruges til at sortere "naturligt" i nedenstående:
Jeg kan se 3 veje frem:
1) kod en userdefined funktion i TSQL - den bliver lang og snasked,
men du kan benytte tiden mens den kører til at bygge en ny garage
eller andet
2) kod en extended SP i C som gør det, og lave en lille userdefined
funktion som wrapper den - så går det bare langsomt, men det kræver
nok lidt hardcore programmering
3) opgrader til 2005 eller 2008, og lav en super simpel lille
userdefined funtion i C# eller VB.NET som gøre det - jeg vil
ovenikøbet tro at det vil performe rimeligt
Arne
| |
Benny Amorsen (10-01-2011)
| Kommentar Fra : Benny Amorsen |
Dato : 10-01-11 19:07 |
|
Leif Neland <leif@neland.dk> writes:
> Jeg cc'er lige denne til dk.edb.system.unix, med fut tilbage til
> dk.edb.database
>
> Kan man med en regex erstatte alle forekomster af tal med det samme
> tal i fast bredde?
>
> Hvis man antager at 6 cifre er nok
> 1 gris har 4 ben
> 2 grise har 8 ben
> 10 grise har 40 ben
> 10 tusindben har 1000 ben
> skal (\d*) expanderes til 6 cifre (med foranstillede nuller for
> læselighedens skyld:
> 000001 gris har 000004 ben
> 000002 grise har 000008 ben
> 000010 grise har 000040 ben
> 000010 tusindben har 001000 ben
Jeg kan ikke komme i tanke om en regexp-replace, der kan gøre det du
ønsker -- med mindre du har f.eks. perl's faciliteter til rådighed. Du
kan naturligvis gøre det med 2 x 6 regexp-replace...
Der er dog rigtigt mange andre måder at opnå "naturlig" sortering. Den
helt oplagte er at lave to ekstra kolonner i et view, dyrantal og
benantal, genereret ud fra en regexp-match på feltet. Hvis du har
rigeligt disk-plads/memory og ikke laver så mange tilføjelser/ændringer
kan du også oprette kolonnerne fysisk og holde dem opdateret med
triggers.
/Benny
| |
Klaus Alexander Seis~ (10-01-2011)
| Kommentar Fra : Klaus Alexander Seis~ |
Dato : 10-01-11 20:07 |
|
Leif Neland skrev:
> Kan man med en regex erstatte alle forekomster af tal med det samme tal
> i fast bredde?
>
> Hvis man antager at 6 cifre er nok
> 1 gris har 4 ben
> 2 grise har 8 ben
> 10 grise har 40 ben
> 10 tusindben har 1000 ben
> skal (\d*) expanderes til 6 cifre (med foranstillede nuller for
> læselighedens skyld:
> 000001 gris har 000004 ben
> 000002 grise har 000008 ben
> 000010 grise har 000040 ben
> 000010 tusindben har 001000 ben
while read antalDyr dyr verbum antalBen navneord
do
printf '%06d %s %s %06d %s\n' $antalDyr $dyr $verbum $antalBen $navneord
done < filMedLinjer
eller hvis man ikke vil ha' tal som 000010, kan man måske bare
sort -k1,4 -m filMedLinjer
PS: Jeg læser ikke selv d.e.database, så du får ikke flere svar fra mig
i denne tråd…
Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
| |
|
|