![]() |
Firebird: Charfeld mit Inhalten nummerisch sortieren
Moin, moin,
ja mein Wochenendproblem lauert noch: Habe ein Char-Feld in einer Firebird-Tabelle. Das Feld enthält je nach Datensatz ein Wort oder eine Zahl oder eben nichts (Null). Jetzt würde ich meine Tabellle gerne so sortieren, dass alle Datensätzen mit Zahlen nummerisch aufsteigend sortiert sind, dann die Datensätze mit den Wörtern kommen und anschließend die ohne Eintrag. Bin mir aber über den Weg nicht im Klaren, da ein einfaches Cast hier wohl kläglich versagt.... Grüße // Martin PS: bekommt man sowas noch mit einer Stored Procedure hin, oder muß man hier gleich an die UDF´s gehen ? |
Re: Firebird: Charfeld mit Inhalten nummerisch sortieren
hi,
ich bin mir, sagen wir zu 80 %, sicher, daß Du dafür UDFs bemühen musst. Dabei fällt mir aber ein, was passiert denn, wenn Du mit den Order By optionen ASCENDING und DESCENDING spielst? Eigentlich müsste doch eine der Reihenfolgen das liefern, was du willst, oder nicht? Gruß Ken |
Re: Firebird: Charfeld mit Inhalten nummerisch sortieren
Hi CenBells,
ja ich habe es noch nicht, aber ascending descending ist nicht das eigentliche Problem. Wenn man ein Charfeld hat, dann sortiert er nach Zeichen vom ersten Zeichen an, dann das nächst e, bis zum letzten. Somit werden Zahlen nicht in ihrer Wertmäßigen Reihenfolge dargestellt ( 2000 würde vor 5 sortiert, da zwei kleiner fünf und dann schaut er erst auf die Nullen). Hoffe ja irgendwie, dass doch eine SP da reicht, aber das wird wohl noch knifflig... Viele Grüße // Martin |
Re: Firebird: Charfeld mit Inhalten nummerisch sortieren
Hi,
ja, das mit der sortierung von 2000 vor 5 ist natülich ein problem. Also zu einer SP fällt mir folgendes ein, selectiere zuerst alle Datensätze, die keine Buchstaben haben. Dann alle, die nur zahlen enthalten und zum schluss die mit der Null. Leider habe ich auch keine ahnung, ob man einfach ein
SQL-Code:
machen kann. Und davon abgesehen ist das höllisch unperfomant.
where ((not 'a' in Feld)
and (not 'b' in Feld).... Also wohl doch lieber eine UDF.. Viel Erfolg. Gruß Ken |
Re: Firebird: Charfeld mit Inhalten nummerisch sortieren
Moin,
also aktuell mal meinen Frühstücksplanungsstand. Derzeit plane ich eine Mini-UDF die die als Resultat einen INTEGER-Wert herausrückt. Die erste Ziffer dieser Zahl ergibt sich: 1 für Zahl 2 für Wort 3 für Nichts Die folgenden Ziffern werden berechnet: Für Zahlenwerte wird gerechnet über die Ziffern von hinten nach vorne. Beispiel: String "234" Ergebnis = 4*10^0 + 3*10^1+2*10^2 Für Buchstaben werden einfach die Ascii-Werte genommen ebenfalls von hinten nach vorne Beispiel: String "abc" Ergebnis := 99 * 10^0 + 98*10^1+97*10^2 Nennen wir die UDF mal HARDCAST dann könnte die Abfrage in etwa foldend aussehen SELECT MyField FROM MyTable ORDER BY HARDCAST(MyField) wobei die Abfrage ein Numerisches Feld als Ergebnis liefert. Soweit zum aktuellen Stand... Grüße // Martin |
Re: Firebird: Charfeld mit Inhalten nummerisch sortieren
Also wenn ich jetzt ne Funktion hätte, die mir true oder false liefert, ob ein Wert in eine Zahl umgewandelt werden kann, dann hätt ich ne Lösung für dich. Ich suche aber nach dieser passenden Funktion. Das Umwandeln selbst ist kein Problem, sofern es sich üm eine Zahlenfolge handelt.
|
Re: Firebird: Charfeld mit Inhalten nummerisch sortieren
Moin Tom,
Danke schonmal. Sonntags geht das alles etwas langsamer. Aber hier kommen erstmal die Rohprozeduren für die IsNumber UDF. Die Codiere ich nachher. Hier kommen erstmal die Internen Routinen dafür.Eigentlich denke ich, dass eine numerische Sortierung auf Char Felder auch für andere noch von Interesse sein kann.
Delphi-Quellcode:
{ Test on Integer value }
Function TBasis_String.IsInteger ( Param : String ) : Boolean; var ErrCode : integer; dummy : Extended; begin Result := False; val(CommaToPoint(Param),dummy,ErrCode); If ( ErrCode = 0 ) and ( dummy = round(dummy) ) then Result := True; End;
Delphi-Quellcode:
{ Test on Float value }
Function IsFloat ( Param : String ) : Boolean; var ErrCode : integer; dummy : Extended; begin Result := False; Param := Trim(Param); val(Param,dummy,ErrCode); If ErrCode = 0 then Result := True; End; @JTom: Ok, die IsFloat-Funktion dürfte dass sein, was Du meinst... Grüße // Martin |
Re: Firebird: Charfeld mit Inhalten nummerisch sortieren
Folgender SQL Befehl liefert dir ein Char-Feld, aber sortiert nach der enthaltenen Zahl:
SQL-Code:
Das Problem ist, das funktioniert nur, solange die Umwandlung von Char nach int auch funktionniert. Steht ein alphanumerisches Zeichen drin, kommt ein Fehler. Wenn ich jetzt aber über einen where-Teil angeben könnt, es sollen nur die Zeilen berücksichtigt werden, wo auch ein int in der Spalte steht, würd die Query klappen... Also sowas in der Art:
select Cast(Feld as int) as Zahl
order by 1
SQL-Code:
Damit würdest du alle Datensätze berücksichtigen, welche einen Integer im Feld stehen haben...
select Cast(Feld as int) as Zahl
where IstInteger(Feld)=true order by 1 Über Union kannst du dir ähnlich die alphanumerischen Felder holen und die mit Inhalt NULL. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz