Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Order by - aufsteigende Zahlenreihe ... (https://www.delphipraxis.net/181250-order-aufsteigende-zahlenreihe.html)

erich.wanker 29. Jul 2014 13:56

Datenbank: firebird • Version: 2.5 • Zugriff über: Zeos LIB

Order by - aufsteigende Zahlenreihe ...
 
Hallo Leute ..

eine Frage, die schon zig tausendmal gestellt wurde .. SORRY !!!

Aber irgendwie steh ich auf der Leitung:

Select * from Tabelle ORDER BY STRINGFIELD ..

ergibt bei mir immer:
1
10
11
12
13
..
19
2
20
21
a
b
c
d
.
.


.. DAS FELD IST EIN STRING!! .. Gibts da nicht eine Möglichkeit, ein Stringfeld so zu filtern und zu sortieren, dass die Zahlenreihe auch richtig dargestellt wird?

Vielen Dank für Infos
Erich

DeddyH 29. Jul 2014 14:01

AW: Order by - aufsteigende Zahlenreihe ...
 
Versuch es mal mit LPAD.
SQL-Code:
ORDER BY LPAD(StringField, 20)

Uwe Raabe 29. Jul 2014 14:09

AW: Order by - aufsteigende Zahlenreihe ...
 
Alternativ geht vielleicht auch

Delphi-Quellcode:
CAST (StringField as integer)

DeddyH 29. Jul 2014 14:12

AW: Order by - aufsteigende Zahlenreihe ...
 
Das dürften die nicht-numerischen Werte vereiteln.

Neutral General 29. Jul 2014 14:14

AW: Order by - aufsteigende Zahlenreihe ...
 
Was auch geht ist dass man zuerst nach char_length(feld) sortiert und dann nach dem feld selbst. Dann kommt auch eine bessere Sortierung bei raus. (evtl. braucht man für char_length noch ein trim um das Feld)

erich.wanker 29. Jul 2014 15:07

AW: Order by - aufsteigende Zahlenreihe ...
 
Danke an alle ..

Hab jetzt eine Lösung gefunden :-) .. Hilfreich waren die Angaben LPAD / RPAD / Trim ...

Dadurch hab ich jetzt (mein Stringfield lautet:OBJECT_NAME):

Code:
my_sql_10:=' ORDER BY CASE WHEN TRIM(OBJECT_NAME) SIMILAR TO '+#39+'\-?[0-9]+'+#39+' ESCAPE '+#39+'\'+#39+' THEN CAST(OBJECT_NAME AS INTEGER) ELSE 9999999 END';
Danke
Erich

baumina 29. Jul 2014 15:49

AW: Order by - aufsteigende Zahlenreihe ...
 
dann werden aber die Buchstaben nicht sortiert (immer 9999999), oder seh ich das falsch?

erich.wanker 29. Jul 2014 16:10

AW: Order by - aufsteigende Zahlenreihe ...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Stimmt ... jetzt werden die Buchstaben nicht mehr richtig sortiert .. bei meinem test hab ich nur jeweils einen Buchstaben eingegeben .. da ist es mir nicht aufgefallen

:-(

Sir Rufo 29. Jul 2014 16:11

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von baumina (Beitrag 1266933)
dann werden aber die Buchstaben nicht sortiert (immer 9999999), oder seh ich das falsch?

So ist das eben, wenn man die falsche Struktur für die Daten wählt, dann fällt einem das bei der Abfrage auf die Füße ;)

baumina 29. Jul 2014 16:15

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von Sir Rufo (Beitrag 1266941)
So ist das eben, wenn man die falsche Struktur für die Daten wählt, dann fällt einem das bei der Abfrage auf die Füße ;)

Ich hab noch ein viel schlimmeres Problem ... Kunde mag folgendes "richtig" sortiert haben:
Code:
HP100
HP100Q
HP200
HP1000
HP1000Q
HP2000
:shock:

Sir Rufo 29. Jul 2014 16:19

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von baumina (Beitrag 1266942)
Zitat:

Zitat von Sir Rufo (Beitrag 1266941)
So ist das eben, wenn man die falsche Struktur für die Daten wählt, dann fällt einem das bei der Abfrage auf die Füße ;)

Ich hab noch ein viel schlimmeres Problem ... Kunde mag folgendes "richtig" sortiert haben:
Code:
HP100
HP100Q
HP200
HP1000
HP1000Q
HP2000
:shock:

Also wenn ich das richtig sehe, dann hast du da einen Präfix, eine Zahl und einen Suffix. Immer so aufgebaut, oder kann das auch anders sein?

DeddyH 29. Jul 2014 16:19

AW: Order by - aufsteigende Zahlenreihe ...
 
Und nur mit dem LPAD wie eingangs vorgeschlagen klappt auch nicht?

jobo 29. Jul 2014 16:21

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von baumina (Beitrag 1266942)
Ich hab noch ein viel schlimmeres Problem ... Kunde mag folgendes "richtig" sortiert haben:
Code:
HP100
HP100Q
HP200
HP1000
HP1000Q
HP2000
:shock:

Da gibt's sicher online Dienste aus China. ;)

Aber ernst: Wenn es nach noch mehr Durcheinander riecht, würde ich vlt ein RegexpReplace durchführen und nach dem Ergebnis sortieren.
Kommt natürlich auch drauf an, was an Funktionen verfügbar ist.

baumina 29. Jul 2014 16:24

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von Sir Rufo (Beitrag 1266943)
Zitat:

Zitat von baumina (Beitrag 1266942)
Zitat:

Zitat von Sir Rufo (Beitrag 1266941)
So ist das eben, wenn man die falsche Struktur für die Daten wählt, dann fällt einem das bei der Abfrage auf die Füße ;)

Ich hab noch ein viel schlimmeres Problem ... Kunde mag folgendes "richtig" sortiert haben:
Code:
HP100
HP100Q
HP200
HP1000
HP1000Q
HP2000
:shock:

Also wenn ich das richtig sehe, dann hast du da einen Präfix, eine Zahl und einen Suffix. Immer so aufgebaut, oder kann das auch anders sein?

Kann auch so aussehen:

Code:
A1-150-100X
A1-150-200
A1-150-1000X
A1-150-2000X
A1-160-100
A1-160-100X
A1-160-200
A1-160-1000

erich.wanker 29. Jul 2014 16:25

AW: Order by - aufsteigende Zahlenreihe ...
 
-> Und nur mit dem LPAD ?

klapp leider nicht ....

baumina 29. Jul 2014 16:27

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von jobo (Beitrag 1266945)

Da gibt's sicher online Dienste aus China. ;)

Aber ernst: Wenn es nach noch mehr Durcheinander riecht, würde ich vlt ein RegexpReplace durchführen und nach dem Ergebnis sortieren.
Kommt natürlich auch drauf an, was an Funktionen verfügbar ist.

Das blöde daran ist, dass keiner weiß wie die morgen ihre Daten eingeben und dann wieder sortiert haben wollen. DENEN leuchtet es natürlich immer ein wie es sein soll, aber meinem Programm halt nicht :(

Sir Rufo 29. Jul 2014 16:34

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von erich.wanker (Beitrag 1266947)
-> Und nur mit dem LPAD ?

klapp leider nicht ....

Du musst dir 2 Spalten aufbauen (Text und Zahlwert) und dann darüber die entsprechende Sortierung machen.
Hier ein online Beispiel (mit MySQL)
SQL-Code:
-- Erst Zahlen, dann Text
SELECT
  COALESCE( TextValue, NumberValue ) `Value`
FROM
  Table1
ORDER BY
  CASE WHEN NOT ISNULL(NumberValue) THEN 0 ELSE 1 END,
  NumberValue,
  TextValue;
-- Erst Text, dann Zahlen
SELECT
  COALESCE( TextValue, NumberValue ) `Value`
FROM
  Table1
ORDER BY
  CASE WHEN NOT ISNULL(NumberValue) THEN 1 ELSE 0 END,
  NumberValue,
  TextValue;
und besser wäre es die Tabelle gleich so aufzubauen ;)

Sir Rufo 29. Jul 2014 16:39

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von baumina (Beitrag 1266946)
Zitat:

Zitat von Sir Rufo (Beitrag 1266943)
Zitat:

Zitat von baumina (Beitrag 1266942)
Zitat:

Zitat von Sir Rufo (Beitrag 1266941)
So ist das eben, wenn man die falsche Struktur für die Daten wählt, dann fällt einem das bei der Abfrage auf die Füße ;)

Ich hab noch ein viel schlimmeres Problem ... Kunde mag folgendes "richtig" sortiert haben:
Code:
HP100
HP100Q
HP200
HP1000
HP1000Q
HP2000
:shock:

Also wenn ich das richtig sehe, dann hast du da einen Präfix, eine Zahl und einen Suffix. Immer so aufgebaut, oder kann das auch anders sein?

Kann auch so aussehen:

Code:
A1-150-100X
A1-150-200
A1-150-1000X
A1-150-2000X
A1-160-100
A1-160-100X
A1-160-200
A1-160-1000

Achtung, Echo:

Also wenn ich das richtig sehe, dann hast du da einen Präfix, eine Zahl und einen Suffix. Immer so aufgebaut, oder kann das auch anders sein?
PräfixZahlSuffix
HP100 
HP100Q
HP200 
HP1000 
HP1000Q
HP2000 
A1-150-100X
A1-150-200 
A1-150-1000X
A1-150-2000X
A1-160-100 
A1-160-100X
A1-160-200 
A1-160-1000 

Uwe Raabe 29. Jul 2014 16:42

AW: Order by - aufsteigende Zahlenreihe ...
 
Wenn man sich in den Sortieralgorithmus einklinken könnte und dort StrCmpLogicalW verwenden könnte...

himitsu 29. Jul 2014 17:05

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1266953)
Wenn man sich in den Sortieralgorithmus einklinken könnte und dort StrCmpLogicalW verwenden könnte...

Sowas wird oft als "Natural-Sort" bezeichnet, oder Dergleichen, also eine Sortierung anhand der "menschlichen" Sprache.

Bei Google suchenfirebird natural sort

p80286 29. Jul 2014 17:30

AW: Order by - aufsteigende Zahlenreihe ...
 
Wenn das alles nicht hilft, dann füg' doch eine Sortierspalte ein. Da stehen die Daten dann so drin wie deine DB sortieren kann z.B. HP 100 -> HP0100, HP 1000 -> HP1000 usw.

Zitat:

Zitat von baumina (Beitrag 1266948)
Das blöde daran ist, dass keiner weiß wie die morgen ihre Daten eingeben und dann wieder sortiert haben wollen. DENEN leuchtet es natürlich immer ein wie es sein soll, aber meinem Programm halt nicht :(

Da bist Du nicht alleine :mrgreen:

Gruß
K-H

baumina 30. Jul 2014 08:29

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von Sir Rufo (Beitrag 1266950)
Achtung, Echo:

Also wenn ich das richtig sehe, dann hast du da einen Präfix, eine Zahl und einen Suffix. Immer so aufgebaut, oder kann das auch anders sein?

Ja, ich denke das mit Präfix, Zahl, Suffix könnte man weiter verfolgen, doch wie findet man den Präfix raus, wenn man weder die Länge noch die Beschaffenheit (ggf. ja auch Zahlen) kennt.

hoika 30. Jul 2014 08:39

AW: Order by - aufsteigende Zahlenreihe ...
 
Hallo,

dann musst du halt lokal sortieren per Code (.Sort -> MyOwnCompare).


Heiko

jobo 30. Jul 2014 10:31

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von baumina (Beitrag 1266995)
Zitat:

Zitat von Sir Rufo (Beitrag 1266950)
Achtung, Echo:

Also wenn ich das richtig sehe, dann hast du da einen Präfix, eine Zahl und einen Suffix. Immer so aufgebaut, oder kann das auch anders sein?

Ja, ich denke das mit Präfix, Zahl, Suffix könnte man weiter verfolgen, doch wie findet man den Präfix raus, wenn man weder die Länge noch die Beschaffenheit (ggf. ja auch Zahlen) kennt.

Also irgendwo ist hier schon der Hinweis mit der expliziten Sortierspalte aufgetaucht. Wieso sollen die Anwender das nicht selber eintragen, wenn die Sortier Systematik letztlich verborgen bleibt? Eine 89 % Lösung ist doch nur Angriffsfläche für den Ärger, wenn mal wieder ein Eintrag aus der Reihe tanzt. "..kann nicht mal eine Liste sortieren..." -Sprüche würde ich mir jedenfalls nicht anhören wollen.

Ein systematischer Ansatz wäre m.E. alle Zahlen im String (erlaubte Trennzeichen wären zu definieren ..) per LPAD auf eine definierte, genügend große Länge bringen, z.B. 15 Zeichen oder auch 20, eigentlich egal. Wieder an der Ursprungsstelle in den String setzen und auf dem Ergebnis sortieren.
In FB würde man wohl ein Funktion schreiben müssen, ist vielleicht problematisch ohne RegEx, im Client sollte es kein Problem sein. Aber ist FB eigentlich bei Dir im Einsatz oder beim TE?

Den natural sort Hinweis von Himitsu finde ich auch interessant.

baumina 30. Jul 2014 13:03

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von jobo (Beitrag 1267009)
Aber ist FB eigentlich bei Dir im Einsatz oder beim TE?

Bei mir ist mySQL im Einsatz.

jobo 30. Jul 2014 13:28

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von baumina (Beitrag 1267030)
Zitat:

Zitat von jobo (Beitrag 1267009)
Aber ist FB eigentlich bei Dir im Einsatz oder beim TE?

Bei mir ist mySQL im Einsatz.

Dann kannst Du vielleicht die UDF mit REGEXP_REPLACE benutzen, um on-the-fly in der SQL Order By Clause einen Sortierausdruck zu erzeugen:
https://github.com/hholzgra/mysql-udf-regexp

sx2008 31. Jul 2014 22:08

AW: Order by - aufsteigende Zahlenreihe ...
 
In Firebird kannst du der Spalte eine Collation mit dem Attribut 'NUMERIC-SORT=1' zuordnen, dann wird so sortiert wie dein Kunde das möchte.
http://www.firebirdsql.org/refdocs/l...collation.html
Ich hab's selber aber nicht getestet.

jobo 1. Aug 2014 07:44

AW: Order by - aufsteigende Zahlenreihe ...
 
Zitat:

Zitat von baumina (Beitrag 1267030)
Zitat:

Zitat von jobo (Beitrag 1267009)
Aber ist FB eigentlich bei Dir im Einsatz oder beim TE?

Bei mir ist mySQL im Einsatz.

Hier ist eine natural sort UDF Implementierung für mySQL
http://stackoverflow.com/a/12257917/384864

Aber Du bist ja schon in Urlaub! :)

nakaramia 11. Aug 2014 16:02

AW: Order by - aufsteigende Zahlenreihe ...
 
Wäre es schneller/ einfacher, den (jeden) Zahlenbereich mit führenden 0 zu erweitern (meinetwegen auf 8 Stellen) und die DB dann mit einer einfachen Sortierung zu betrauen?

himitsu 11. Aug 2014 16:16

AW: Order by - aufsteigende Zahlenreihe ...
 
Wenn das nur einmal pro Datensatz gemacht wird, z.B. als zusätzliche Spalte im SELECT, dann ist es zumindestens nicht sehr viel langsamer.
Aber wenn dann mal einer auf die Idee kommt und eine Zahl mit mehr als 8 Dezimalstellen verwendet, dann geht das natürlich nicht mehr.

Der Bearbeitung und Erstellen des Vergleichstrings ist aber vermutlich/bestimmt etwas langsamer, als eine gut implementierter Vergleichsfunktion.
Als Vergleich:
Delphi-Quellcode:
if s = '123' then
ist schneller als ein
Delphi-Quellcode:
if s = IntToStr(123) then
,
bzw.
Delphi-Quellcode:
if i = 123 then
ist schneller als ein
Delphi-Quellcode:
if IntToStr(i) = '123' then
.

Kommt dann darauf an, wie gut der Sortieralgo ist, also wieviele Vergleiche der benötigt
und wie groß der Unterschied zwischen der ErweitereMitNullen-Funktion ist, gegenüber der zusätzlichen Zeit für eine aufwändigere Vergleichsfunktion.

Wenn die Strings für jeden einzelnen Vergleich so umgewandelt werden (mit Nullen füllen), dann würde das jedenfalls schnell extrem langsam.


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