![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC
Integer als Text sortieren
Moin,
ich habe hier ein Problem mit Firebird, das auf den ersten Blick ganz einfach zu lösen aussieht, aber ich krieg's irgendwie nicht gebacken. Gegeben ist ein einer Tabelle ein Nummerierungsfeld 'O_Nr' vom Typ Integer. Ein Order By O_Nr sortiert natürlich richtig, aber jetzt möchte ich das Ganze wie Postleitzahlen behandeln, z.B. 22 234 3 4567 48 usw. Das geht ja nicht mit Integer, also einfach CAST(O_Nr AS BLOB) x und Order By x - Pustekuchen, Firebird macht da immer noch eine Sortierung als Integer, das wird wohl implizit wieder gewandelt... Wie mach ich das denn nun richtig? Im Netz find ich nix Passendes... |
AW: Integer als Text sortieren
Wieso BLOB, wenn du doch TEXT VARCHAR willst?
Delphi-Quellcode:
oder vielleicht auch
SELECT O_Nr, CAST(O_Nr AS VARCHAR) AS x
... ORDER BY x
Delphi-Quellcode:
SELECT O_Nr
... ORDER BY CAST(O_Nr AS VARCHAR) |
AW: Integer als Text sortieren
Hallo Himitsu,
Firbird gibt mir mit VARCHAR einen Fehler -104 Token unknown aus... |
AW: Integer als Text sortieren
SQL-Code:
select LPad(O_Nr,10,0) As IntegerAlsString from tabelle order by IntegerAlsString
LPad: Erster Parameter ist die zu verarbeitende Spalte. Zweiter Parameter ist die Länge, auf die diese Spalte linksbündig aufgefüllt werden soll. Dritter Parameter ist das Zeichen, mit dem linksbündig aufgefüllt werden soll. Im Beispiel wird die Spalte O_Nr linksbündig auf insgesamt zehnstellig mit Nullen aufgefüllt.
Code:
Es sollte aber auch so gehen:
22 -> 0000000022
234 -> 0000000234 3 -> 0000000003 4567 -> 0000004567 48 -> 0000000048
SQL-Code:
select * from tabelle order by lpad(O_Nr,10,'0')
Sollen die Zahlen jedoch rechtsbündig aufgefüllt werden, dann wäre sowas möglich:
SQL-Code:
Was LPad nach links macht, macht RPad nach rechts.
select * from tabelle order by RPad(O_Nr,10,'0')
|
AW: Integer als Text sortieren
Daaaanke, RPAD() ist genau das Richtige!
Auch ohne Bedanken-Button: :thumb::cheers: |
AW: Integer als Text sortieren
Oh wie praktisch. Hatte genau das gleiche Problem! Danke dir, Delphi.Narium, für die gute Erklärung! Ich hätte wohl noch eine Ewigkeit mit diesem Problem verbracht...
|
AW: Integer als Text sortieren
Zitat:
Code:
Bei sehr großen Datenmengen (d.h. nicht 1000 records, aber bei 1 Million
select * from tabelle order by 1000000+O_Nr
auf jeden Fall) kann man ein expression index dazu anlegen d.h.
Code:
oder
CREATE INDEX TAB_IDX1 ON TAB COMPUTED BY (1000000+O_NR)
Code:
und ergänzend noch: Wenn du ähnlich wie bei Postleitzahlen was mit führender
CREATE INDEX TAB_IDX2 ON TAB COMPUTED BY (lpad(O_Nr,10,'0'))
0 Logik brauchst, wie hier beim Sortieren, dann nehm besser gar nicht erst ein integer, sonder char oder varchar. Als Auswahlkriterium des Datentyps: muss ich mit dem wert was rechnen? dann numerisch, sonst eher nicht! Die Summe von 10 Postleitzahlen zum Beispiel hat wenig sinnvolle Anwendungen, durchschnitt auch nicht. und beim char/varchar kannst du ggf per trgger direkt den wert mit lpad sauber formatieren und gleich so speichern, das auch der order by sinnvoll ist |
AW: Integer als Text sortieren
Zitat:
Code:
ORDER BY CAST(O_Nr AS VARCHAR(80))
|
AW: Integer als Text sortieren
Ich dachte es soll so sortiert werden?
Zitat:
Und das LPAD wäre dann doch falsch und müsste eher ein RPAD sein, denn LPAD Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 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 by Thomas Breitkreuz