it-swarm.com.de

SQL Order String als Nummer

Ich habe Nummern als VARCHAR in einer MySQL-Datenbank gespeichert. Ich kann sie nicht INT wegen einiger anderer abhängiger Umstände machen.

Sie werden beim Sortieren als Zeichen und nicht als Zahl verwendet.

In der Datenbank habe ich

1 2 3 4 5 6 7 8 9 10...

Auf meiner Seite wird die geordnete Liste wie folgt angezeigt:

1 10 2 3 4 5 6 7 8 9

Wie kann ich es in aufsteigender Reihenfolge anzeigen lassen?

115
Jamol

Wenn möglich, sollten Sie den Datentyp der Spalte in eine Zahl ändern, wenn Sie ohnehin nur Zahlen speichern.

Wenn Sie das nicht tun können, setzen Sie Ihren Spaltenwert in ein integerexplizit mit

select col from yourtable
order by cast(col as unsigned)

oder implizit zum Beispiel mit einer mathematischen Operation, die eine Umwandlung in Zahl erzwingt

select col from yourtable
order by col + 0

BTW MySQL konvertiert Strings von links nach rechts. Beispiele:

string value  |  integer value after conversion
--------------+--------------------------------
'1'           |  1
'ABC'         |  0   /* the string does not contain a number, so the result is 0 */
'123miles'    |  123 
'$123'        |  0   /* the left side of the string does not start with a number */
218
juergen d

Ein anderer Weg, ohne eine einzige Besetzung.

(Für Leute, die JPA 2.0 benutzen, wo kein Casting erlaubt ist)

select col from yourtable
order by length(col),col

EDIT: funktioniert nur für positive ganze Zahlen

61
Velter

Die Spalte, nach der ich sortiere, enthält eine beliebige Kombination aus Alpha und Numerisch. Daher habe ich die Vorschläge in diesem Beitrag als Ausgangspunkt verwendet und mir dies ausgedacht.

DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');

SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;

Ergebnisse

ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002

Hoffe das hilft

16
Losbear

Ein anderer und einfacher Weg

ORDER BY ABS(column_name)

10
Parth Solanki

Ein anderer Weg, um zu konvertieren.

Wenn Sie ein Zeichenfolgenfeld haben, können Sie es oder seinen numerischen Teil folgendermaßen umwandeln: Fügen Sie führende Nullen hinzu, um alle Ganzzahlzeichenfolgen mit gleicher Länge zu erstellen.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

oder sortiere nach Teilen eines Feldes wie 'tensymbols13', 'tensymbols1222' usw.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 
4
shukshin.ivan

Das funktioniert bei mir.

select * from tablename
order by cast(columnname as int) asc
3

Ich habe auch nach Sortierfeldern gesucht, die ein Buchstabenpräfix haben. Hier ist, was ich herausgefunden habe, die Lösung. Dies kann hilfreich sein, wenn Sie nach der gleichen Lösung suchen.

Feldwerte:

FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789

select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc

SUBSTRING(field,3,9) Ich habe 9 eingegeben, weil 9 ausreicht, um maximal 9 ganzzahlige Ziffernwerte zu speichern.

Das Ergebnis ist also 123456789 123456788 123456787 ... 100 99 ... 2 1

2
user2400083

Dies behandelt negative Zahlen, Brüche, Strings, alles:

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;
2
Amir