ORDER BY: in natürlicher Reihenfolge sortieren

Hallo Leute,

ich suche eine Möglichkeit meine ganz einfache SELECT zu sortieren, so dass am Ende die Reihenfolge natürlich ist.
Wenn ich ein ORDER BY mache, kommt nämlich das hier bei raus:

Strasse 1
Strasse 10
Strasse 11
Strasse 12
Strasse 2
Strasse 3
Strasse 4
Strasse 5
Strasse 6
Strasse 7
Strasse 8
Strasse 9

Geht das nicht so, dass nach …


Strasse 9
Strasse 10
Strasse 11
Strasse 12

usw. geordnet wird?

Sorry für die doofe Anfängerfrage! Ich habe aber sonst nichts Brauchbares
gefunden, deshalb mein “neues Thema”

Viele Grüße
Soezkan

Du musst die Daten so angeben:

Strasse 01
Strasse 02
...
Strasse 09
Strasse 10
...

da die Sortierung als “Text” stattfindet, und da ist “10” eben kleiner als “2”. Eine andere Möglichkeit wäre, die Zahlen in ein separates Feld zu packen.
Wenn der Aufbau immer ähnlich ist, kann man natürlich Text und Zahl mit einer Funktion trennen und dann sortieren.

Da gibt es nicht viel hinzuzufügen …
Der beste Weg wäre wirklich, die Hausnummer in eingetrenntes Feld zu packen (aber dort auch als Text hinterlegen, es gibt zu viele Sonderfälle).

Danke für die Antwort. Das was ich hier geschrieben habe, war ein Beispiel.
Eigentlich (hätte ich auch gleich schreiben können :wink: ) habe ich zwei Tabellen:

table adress_values

int id
int fid
varchar value


table adress_fields

int fid
varchar description

SELECT value FROM adress_values WHERE fid = 'strasse' ORDER BY value;

Die Abfrage ist eigentlich ok. Aber wenn ich beispielsweise nach Hausnummern sortiere, dann ist ist die Reihefolge bspw.:

Hausnummer:
1
2
212
23
245
299
3
32
4
5
usw.

Was mache ich falsch bzw. wie könnte man das lösen!

Vielen Dank schonmal jetzt,
Soezkan

Warum das so ist, wurde ja schon gesagt. Als schnelle Lösung:

test=*# select * from str;
  name
--------
 str 1
 str 2
 str 3
 str 10
 str 9
 str 11
 str 8
 str 12
(8 rows)

test=*# select * from str order by regexp_replace(name,'[^0-9]','','g')::int ;
  name
--------
 str 1
 str 2
 str 3
 str 8
 str 9
 str 10
 str 11
 str 12
(8 rows)

Andreas

Nach INT casten.

Andreas

Sorry, aber ich habs noch nicht hinbekommen. Wenn ich

 
SELECT value 
FROM adress_values 
WHERE fid = 'strasse' 
ORDER BY regexp_replace(value,'[^0-9]','','g')::int;

aufrufe, bekomme ich eine Fehlermeldung:
… the right syntax to use near ‘(value,’[^0-9]’,’’,‘g’)::int’ at line 12 query:

Und wo bringe ich ein ASC bzw. DESC unter?

1000 Dank für weitere Hilfe,
Soezkan

Welche Version? regexp_replace ist etwas neu, seit 8.1 oder so erst. Das DESC oder ASC käme einfach nach dem Cast-Operator, mit Leerzeichen, is klar, oder?

Andreas

Ups, ich glaube ich bin hier falsch. Sorry, denn ich benutze MySQL. Ich dachte, das ist egal. Bin eben ein Einstieger was SQL anbelangt. Hm.
Trotzdem vielleicht noch einen Tipp, was ich da machen könnte?

Danke,
Soezkan

Klar: PostgreSQL nutzen.

Andreas

Ich habe dazu auf meinem Serverli aber nicht die Möglichkeit und kein
Geld das umsetzen zu lassen. Bin ich raus? Oder gibts auch ne Lösung für mich?

Ja, nein. g

MySQL kann IMHO nicht nach dem Resultat einer Funktion sortieren. Oder doch? Ich weiß nicht. Schau einfach in die Doku zu MySQL, was es da an Stringfunktionen gibt, und probier es. Es gibt halt Dinge, die ich nicht gern anfasse: Kot, Windows, MySQL gehören dazu.

Andreas

ja und es gibt Deutsche, die alle Amerikaner scheisse finden, weil Sie kein englisch können :wink:

Ich habe eine Lösung gefunden (zumindest für MySQL):

SELECT value 
FROM adress_values 
WHERE fid = 'strasse' 
ORDER BY value+0

Das funktioniert nicht wirklich, oder?

Das würde bedeuten, das Mysql Texte addieren kann … und dann auch noch falsch addiert. Wenn man überhaupt irgendwas (einen Text mit Nummern drin) in Zahlen umwandeln will, bricht man ab, sobald man irgendetwas findet, was nicht 0-9 entspricht. Bei dir kommt der Straßenname aber vor der Zahl …

Ist das krank …

Hab das mal getestet (MySQL - 5.0.22) und bei mir funktioniert es nicht. Kommt zwar keine Fehlermeldung o. ä., aber die Sortierreihenfolge stimmt auch nicht.

Naja was erwartet ihr auch? :wink: MySQL ist zwar in einigen Sachen komisch aber an gewisse Regeln hält es sich auch. So aber nu ist jut…

cu tb