AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Integer als Text sortieren

Ein Thema von Poelser · begonnen am 29. Mär 2021 · letzter Beitrag vom 2. Apr 2021
Antwort Antwort
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#1

Integer als Text sortieren

  Alt 29. Mär 2021, 10:58
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC
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...
LG aus dem hohen Norden, Edmund
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: Integer als Text sortieren

  Alt 29. Mär 2021, 11:07
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Integer als Text sortieren

  Alt 29. Mär 2021, 11:13
Hallo Himitsu,

Firbird gibt mir mit VARCHAR einen Fehler -104 Token unknown aus...
LG aus dem hohen Norden, Edmund
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#4

AW: Integer als Text sortieren

  Alt 29. Mär 2021, 11:24
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: 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:
select * from tabelle order by RPad(O_Nr,10,'0') Was LPad nach links macht, macht RPad nach rechts.

Geändert von Delphi.Narium (29. Mär 2021 um 11:27 Uhr) Grund: Text ergänzt.
  Mit Zitat antworten Zitat
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Integer als Text sortieren

  Alt 29. Mär 2021, 11:40
Daaaanke, RPAD() ist genau das Richtige!
Auch ohne Bedanken-Button:
LG aus dem hohen Norden, Edmund
  Mit Zitat antworten Zitat
internet11

Registriert seit: 31. Mär 2021
Ort: Berlin
5 Beiträge
 
#6

AW: Integer als Text sortieren

  Alt 1. Apr 2021, 14:03
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...
Kaja
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Integer als Text sortieren

  Alt 2. Apr 2021, 08:48
Es sollte aber auch so gehen: 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
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung

Geändert von IBExpert ( 2. Apr 2021 um 08:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Integer als Text sortieren

  Alt 2. Apr 2021, 09:01
...
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))
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

AW: Integer als Text sortieren

  Alt 2. Apr 2021, 14:50
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 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