2011-01-14 10 views
3

ich eine Spalte eines Typs Zeichenfolge haben, die Werte in Zeilen wie enthält:ORDER BY in SQL

1-1 
1-5 
1-14 
1-7 
1-3 

Nun, wenn ich die ORDER BY auf dieser Spalte verwenden erhalte ich den Auftrag als:

1-1 
1-14 
1-3 
1-5 
1-7 

Was wäre der richtige Weg, es als 1-1, 1-3, 1-5,1-7,1-14

Vielen Dank für Ihre Zeit

+0

Es gibt keinen einfachen Weg mit diesen Daten als. Können Sie das Schema ändern, um die Daten auf andere Weise zu speichern? – Mark

+0

Ist die "1-" für alle Felder gleich, oder haben Sie auch "2-", "3-" und "10-"? Sind das wirklich Datumsfelder (Monat und Tag)? Kommt "1-31" vor oder nach "2-1"? – rajah9

+0

@Mark Kann das Schema leider nicht ändern. @ rajah9 das sind keine Daten, sie sind eine Art von Codes. – Adnan

Antwort

7

zu bestellen Sie können die „1-1“ in „1-01“

+0

Oder umbenennen 1-1 zu 0001-0001, nur um sicher zu sein. ;) – WCWedin

+0

ausgezeichnete Idee. – Adnan

+0

Die führenden Nullen können bei Bedarf bei der Formatierung im Frontend entfernt werden. Viel einfacher, wenn es so gemacht wird :) – onedaywhen

2

Versuchen Sie, diese umbenennen:

SELECT * FROM 
(
SELECT '1-1' Id 
UNION 
SELECT '1-5' Id 
UNION 
SELECT '1-14' Id 
UNION 
SELECT '1-7' Id 
UNION 
SELECT '1-3' Id 
) a 
ORDER BY CAST(REPLACE(Id, '-', '') AS UNSIGNED) 
+0

Netter Ansatz, aber Sie werden Probleme bekommen, wenn 2-1 kleiner als 1-11 ist. Sie müssten sich teilen, beide werfen und nach dem ersten Wert sortieren, zweiter Wert – magnattic

+0

Dies würde "11-3" vor "1-14" setzen. – Quassnoi

1

Gibt es eine Möglichkeit, die Säule in zwei separaten Spalten und Concat die beiden zusammen nach dem Sortieren einzeln aufzuspalten ?

Das Problem ist jetzt, dass Ihre Spalte als Zeichenfolgen nicht als Ganzzahlen sortiert.

5

Der richtige Weg wäre, sie als Ganzzahlen in verschiedenen Spalten zu speichern.

0

Sie können so etwas wie verwenden (wenn der erste Buchstabe doesn-t metter)

Auftrag von CAST (SUBSTRING (Feld, CHARINDEX (Feld, '-', 0) +1, LEN (Feld) +1 obwohl) als int)

Nicht sehr hübsch ..

10

Ihre erste Zeichen Unter der Annahme, kann auch variieren:

order by convert(substr(my_field, 1, locate(my_field, '-') - 1) as int), 
     convert(substr(my_field, locate(my_field, '-') + 1) as int) 
+3

+1. Dies ist die richtige Antwort auf die gestellte Frage. Allerdings könnte eine Änderung des Schemas die bessere Lösung sein. – WCWedin

0
SELECT * 
FROM (
     SELECT '1-1' Id 
     UNION ALL 
     SELECT '1-5' Id 
     UNION ALL 
     SELECT '1-14' Id 
     UNION ALL 
     SELECT '1-7' Id 
     UNION ALL 
     SELECT '1-3' Id 
     UNION ALL 
     SELECT '10-4' Id 
     ) a 
ORDER BY 
     CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(id, '-', -2), '-', 1) AS UNSIGNED), 
     CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(id, '-', -1), '-', 1) AS UNSIGNED) 
1

Wenn es Es ist absolut unmöglich, Änderungen an der Struktur vorzunehmen, ich würde sagen, Carl Manasters Methode ist die beste. Das würde bei großen Datenmengen jedoch langsam funktionieren.

Sie können auch versuchen, eine „Art“ -Spalte (und indizieren) hinzuzufügen, wird jedes Mal, wenn ein neuer Code hinzugefügt wird Sie es Wert zB berechnen kann:

1-5 wird 1000 + 5 = 1005 1-14 wird 1000 + 14 = 1014

und speichern Sie es in dieser Sortierspalte. Das wird viel schneller funktionieren. Sie können auch einen einfachen Trigger schreiben, so dass dieser Sortierwert automatisch berechnet wird.