AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird SQL sortieren mit SIMILAR TO
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird SQL sortieren mit SIMILAR TO

Ein Thema von stalkingwolf · begonnen am 12. Apr 2024 · letzter Beitrag vom 16. Apr 2024
Antwort Antwort
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#1

Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 09:22
Datenbank: Firebird • Version: 2,5+ • Zugriff über: direkt
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;
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

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

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 10:06
was soll denn dein gewünschtes sortierergbenis sein
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 haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 10:30
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 )
Miniaturansicht angehängter Grafiken
gpt.png  
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#4

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 10:57
Hört sich erstmal an, als würde eine NUMERIC-SORT COLLATION das bieten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
591 Beiträge
 
Delphi XE6 Enterprise
 
#5

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 12:23
...probier mal. (ich habs nicht getestet )
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.
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 13:22
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
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
591 Beiträge
 
Delphi XE6 Enterprise
 
#7

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 15:53
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.

Geändert von Frickler (12. Apr 2024 um 15:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 16:02
* wenn es keinen . gibt, einen . hinten anhängen
* links mit 0 füllen, also gewünschte Anzahl minus Position des . (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 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



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 . kein Punkt sondern ein Irgendwas ist?
[edit] Stimmt ja, SIMILAR war kein RegEx, sondern was Eigenes und hier isses das _ .

Zitat:
CAST ENTRYAS INTEGER)
Fehlt da nicht eine Klammer ( und ein Leerzeichen?

Schneidet CAST eigentlich ab oder knallt es, wenn es kein Integer ist?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (12. Apr 2024 um 16:26 Uhr) Grund: zu langsam
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
591 Beiträge
 
Delphi XE6 Enterprise
 
#9

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 12. Apr 2024, 16:29
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
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#10

AW: Firebird SQL sortieren mit SIMILAR TO

  Alt 16. Apr 2024, 11:36
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.

Geändert von stalkingwolf (16. Apr 2024 um 11:43 Uhr)
  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 08:14 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