| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | 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/
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |