Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird SQL sortieren mit SIMILAR TO (https://www.delphipraxis.net/214964-firebird-sql-sortieren-mit-similar.html)

stalkingwolf 12. Apr 2024 08:22

Datenbank: Firebird • Version: 2,5+ • Zugriff über: direkt

Firebird SQL sortieren mit SIMILAR TO
 
Guten Morgen,

ich müsste folgende Inhalte in einer Tabellenspalte sortieren
2 , 10 ,10.1, 10a, 12, 12.1a, 14, 20 usw.

Frage ich ChatGPT schlägt er mir regexp vor. Ok klingt logisch
Firebird hat dies aber nicht, sondern "SIMILAR TO".

Hat damit schon einmal jemand was gemacht? Ich komme nicht weiter.
Die Kombination z.b 10a oder 12.1a bekomme ich nicht hin.

Das müsste ja dann ca so aussehen :

Code:
SELECT ENTRY
FROM TABELLE
order by
  CASE
    WHEN ENTRY SIMILAR TO '[[:DIGIT:]].[[:DIGIT:]]' THEN CAST ENTRYAS INTEGER)
    WHEN ENTRY SIMILAR TO '[[:DIGIT:]][a-z]' THEN ENTRY ....
    ELSE CAST(ENTRY AS INTEGER)
  END;

IBExpert 12. Apr 2024 09:06

AW: Firebird SQL sortieren mit SIMILAR TO
 
was soll denn dein gewünschtes sortierergbenis sein

haentschman 12. Apr 2024 09:30

AW: Firebird SQL sortieren mit SIMILAR TO
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

create a sql um die texte in der firebird datenbank 2 , 10 ,10.1, 10a, 12, 12.1a, 14, 20 aufsteigend zu sortieren
Code:
SELECT text_column
FROM your_table
ORDER BY
  CAST(SUBSTRING(text_column FROM '^[0-9]+') AS INTEGER),
  SUBSTRING(text_column FROM '[^0-9]+');
...probier mal. (ich habs nicht getestet :wink:)

Uwe Raabe 12. Apr 2024 09:57

AW: Firebird SQL sortieren mit SIMILAR TO
 
Hört sich erstmal an, als würde eine NUMERIC-SORT COLLATION das bieten.

Frickler 12. Apr 2024 11:23

AW: Firebird SQL sortieren mit SIMILAR TO
 
Zitat:

Zitat von haentschman (Beitrag 1535688)
...probier mal. (ich habs nicht getestet :wink:)

Wird nicht gehen. Das ist PostgreSQL-Syntax.

Aber Uwe gibt einen guten Tipp: mit
Code:
CREATE COLLATION UNICODE_NUMERIC
FOR UTF8
FROM UNICODE
CASE INSENSITIVE
'NUMERIC-SORT=1';
kann dann so
Code:
SELECT entry FROM tabelle ORDER BY entry COLLATE UNICODE_NUMERIC
sortiert werden.

TigerLilly 12. Apr 2024 12:22

AW: Firebird SQL sortieren mit SIMILAR TO
 
Ich würde die Strings passend umbauen (zumindest fürs Sortieren):

0000002.0000
0000010.0000
0000010.1000
0000010.a000
0000012.0000
0000012.1a00
0000014.0000
0000020.0000

Frickler 12. Apr 2024 14:53

AW: Firebird SQL sortieren mit SIMILAR TO
 
Zitat:

Zitat von TigerLilly (Beitrag 1535701)
Ich würde die Strings passend umbauen (zumindest fürs Sortieren):

0000002.0000
0000010.0000
0000010.1000
0000010.a000
0000012.0000
0000012.1a00
0000014.0000
0000020.0000

Ich nehme mal an, dieses Feld soll auch "menschenlesbar" sein. Das heißt, man braucht dann noch ein zweites Feld, in das dann die "umgebauten" Strings kommen (bestückt von einem Trigger), und gibt beim Sortieren das zweite Feld an.

Oder man benutzt einen berechneten Index.

Aber was spricht gegen die Collation?

P.S.: ein Problem bei "SILIMAR TO" ist, dass die Regex das ganze Feld matchen muss. Teilstrings werden nicht gefunden. Wenn Deine Regex nach "Ziffern Punkt Buchstaben" sucht, wird "Ziffern Punkt Buchstaben Ziffern" nicht gefunden.

himitsu 12. Apr 2024 15:02

AW: Firebird SQL sortieren mit SIMILAR TO
 
* wenn es keinen
Delphi-Quellcode:
.
gibt, einen
Delphi-Quellcode:
.
hinten anhängen
* links mit
Delphi-Quellcode:
0
füllen, also gewünschte Anzahl minus Position des
Delphi-Quellcode:
.
(könnte man bestimmt LPAD für nutzen und einen Leerstring um die gewünschten x Nullen erweitern)
* und zuletzt hinten via RPAD mit weiteren
Delphi-Quellcode:
0
füllen

Wäre es nicht einfacher direkt ein "natual sort" zu verwenden?
[edit] Jupp, siehe #5

https://stackoverflow.com/questions/...ng-numerically
https://forum.lazarus.freepascal.org...?topic=48913.0



Zitat:

Zitat von stalkingwolf (Beitrag 1535680)
SQL-Code:
SELECT ENTRY
FROM TABELLE
order by
  CASE
    WHEN ENTRY SIMILAR TO '[[:DIGIT:]].[[:DIGIT:]]' THEN CAST ENTRYAS INTEGER)
    WHEN ENTRY SIMILAR TO '[[:DIGIT:]][a-z]' THEN ENTRY ....
    ELSE CAST(ENTRY AS INTEGER)
  END;

Du weißt, dass im RegEx der
Delphi-Quellcode:
.
kein Punkt sondern ein Irgendwas ist?
[edit] Stimmt ja, SIMILAR war kein RegEx, sondern was Eigenes und hier isses das
Delphi-Quellcode:
_
. :oops:

Zitat:

Delphi-Quellcode:
CAST ENTRYAS INTEGER)

Fehlt da nicht eine Klammer ( und ein Leerzeichen?

Schneidet CAST eigentlich ab oder knallt es, wenn es kein Integer ist?

Frickler 12. Apr 2024 15:29

AW: Firebird SQL sortieren mit SIMILAR TO
 
Zitat:

Zitat von himitsu (Beitrag 1535709)
Schneidet CAST eigentlich ab oder knallt es, wenn es kein Integer ist?

Es knallt.

Lösung a la Delphi:
Code:
CREATE FUNCTION StrToIntDef(str VARCHAR(20), def INTEGER = 0)
RETURNS INTEGER
AS
BEGIN
  RETURN CAST(str AS INTEGER);
  WHEN ANY DO RETURN def;
END

stalkingwolf 16. Apr 2024 10:36

AW: Firebird SQL sortieren mit SIMILAR TO
 
Hallo zusammen,

vielen Dank für die Antworten. Ich werde nachher einmal ein paar testen.
Der Inhalt der Spalten ist nicht von uns sondern von einem Fremdsystem auf welches wir zugreifen.

Edit : collate hat einwandfrei funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 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