Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Integer als Text sortieren (https://www.delphipraxis.net/207482-integer-als-text-sortieren.html)

Poelser 29. Mär 2021 10:58

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

himitsu 29. Mär 2021 11:07

AW: Integer als Text sortieren
 
Wieso BLOB, wenn du doch TEXT VARCHAR willst?

Delphi-Quellcode:
SELECT O_Nr, CAST(O_Nr AS VARCHAR) AS x
...
ORDER BY x
oder vielleicht auch
Delphi-Quellcode:
SELECT O_Nr
...
ORDER BY CAST(O_Nr AS VARCHAR)

Poelser 29. Mär 2021 11:13

AW: Integer als Text sortieren
 
Hallo Himitsu,

Firbird gibt mir mit VARCHAR einen Fehler -104 Token unknown aus...

Delphi.Narium 29. Mär 2021 11:24

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:
22   -> 0000000022
234  -> 0000000234
3    -> 0000000003
4567 -> 0000004567
48   -> 0000000048
Es sollte aber auch so gehen:
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:
select * from tabelle order by RPad(O_Nr,10,'0')
Was LPad nach links macht, macht RPad nach rechts.

Poelser 29. Mär 2021 11:40

AW: Integer als Text sortieren
 
Daaaanke, RPAD() ist genau das Richtige!
Auch ohne Bedanken-Button: :thumb::cheers:

internet11 1. Apr 2021 14:03

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

IBExpert 2. Apr 2021 08:48

AW: Integer als Text sortieren
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1486254)
Es sollte aber auch so gehen:
SQL-Code:
select * from tabelle order by lpad(O_Nr,10,'0')

genau der richtige weg, gibt aber noch einen weg, den man nicht nur da in firebird benutzen kann

Code:
select * from tabelle order by 1000000+O_Nr
Bei sehr großen Datenmengen (d.h. nicht 1000 records, aber bei 1 Million
auf jeden Fall) kann man ein expression index dazu anlegen

d.h.

Code:
CREATE INDEX TAB_IDX1 ON TAB COMPUTED BY (1000000+O_NR)
oder

Code:
CREATE INDEX TAB_IDX2 ON TAB COMPUTED BY (lpad(O_Nr,10,'0'))
und ergänzend noch: Wenn du ähnlich wie bei Postleitzahlen was mit führender
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

IBExpert 2. Apr 2021 09:01

AW: Integer als Text sortieren
 
Zitat:

Zitat von himitsu (Beitrag 1486252)
...
ORDER BY CAST(O_Nr AS VARCHAR)

würde zwar funktionieren, wenn hinter varchar die länge in klammern wäre, löst aber ohne lpad oder den anderen Trick das problem nicht

Code:
ORDER BY CAST(O_Nr AS VARCHAR(80))

himitsu 2. Apr 2021 14:50

AW: Integer als Text sortieren
 
Ich dachte es soll so sortiert werden?
Zitat:

22
234
3
4567
48
usw.
Dann muß doch "nur" der Wert als String/Text interpretiert werden, anstatt als Zahl/Integer.

Und das LPAD wäre dann doch falsch und müsste eher ein RPAD sein, denn LPAD
Zitat:

0000022
0000234
0000003
0004567
0000048
usw.
ergibt doch
Zitat:

0000003
0000022
0000048
0000234
0004567
usw.
also
Zitat:

3
22
48
234
4567
usw.
:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz