![]() |
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 |
AW: Order by - aufsteigende Zahlenreihe ...
|
AW: Order by - aufsteigende Zahlenreihe ...
Alternativ geht vielleicht auch
Delphi-Quellcode:
CAST (StringField as integer)
|
AW: Order by - aufsteigende Zahlenreihe ...
Das dürften die nicht-numerischen Werte vereiteln.
|
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)
|
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:
Danke
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';
Erich |
AW: Order by - aufsteigende Zahlenreihe ...
dann werden aber die Buchstaben nicht sortiert (immer 9999999), oder seh ich das falsch?
|
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
:-( |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
|
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
Code:
:shock:
HP100
HP100Q HP200 HP1000 HP1000Q HP2000 |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
|
AW: Order by - aufsteigende Zahlenreihe ...
Und nur mit dem LPAD wie eingangs vorgeschlagen klappt auch nicht?
|
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
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. |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
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 |
AW: Order by - aufsteigende Zahlenreihe ...
-> Und nur mit dem LPAD ?
klapp leider nicht .... |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
|
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
![]()
SQL-Code:
und besser wäre es die Tabelle gleich so aufzubauen ;)
-- 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; |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
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?
|
AW: Order by - aufsteigende Zahlenreihe ...
Wenn man sich in den Sortieralgorithmus einklinken könnte und dort
![]() |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
![]() |
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:
Gruß K-H |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
|
AW: Order by - aufsteigende Zahlenreihe ...
Hallo,
dann musst du halt lokal sortieren per Code (.Sort -> MyOwnCompare). Heiko |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
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. |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
|
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
![]() |
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.
![]() Ich hab's selber aber nicht getestet. |
AW: Order by - aufsteigende Zahlenreihe ...
Zitat:
![]() Aber Du bist ja schon in Urlaub! :) |
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?
|
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:
ist schneller als ein
if s = '123' then
Delphi-Quellcode:
,
if s = IntToStr(123) then
bzw.
Delphi-Quellcode:
ist schneller als ein
if i = 123 then
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