Ist es möglich, Text in eine Zahl in MySQL-Abfrage umzuwandeln? Ich habe eine Spalte mit einem Bezeichner, der aus einem Namen und einer Nummer im Format "Name-Nummer" besteht. Die Spalte hat den Typ VARCHAR. Ich möchte die Zeilen nach der Nummer sortieren (Zeilen mit demselben Namen), aber die Spalte wird nach der Zeichenreihenfolge sortiert, d. H.
name-1
name-11
name-12
name-2
Kann ich die Zahl "varchar" in die "echte" Zahl umwandeln und sie zum Sortieren der Zeilen verwenden, wenn ich die Nummer ausschneide? Ich möchte folgende Reihenfolge erhalten.
name-1
name-2
name-11
name-12
Ich kann die Nummer nicht als separate Spalte darstellen.
bearbeitet 2011-05-11 9:32
Ich habe folgende Lösung gefunden ... ORDER BY column * 1
. Wenn der Name keine Nummern enthält, ist die Verwendung dieser Lösung sicher?
Das sollte funktionieren:
SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Sie können SUBSTRING
und CONVERT
verwenden:
SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);
Dabei ist name_column
die Spalte mit den "name-" -Werten. Die Variable SUBSTRING
entfernt alles vor dem sechsten Zeichen (d. H. Dem Präfix "name-") und konvertiert dann die Variable CONVERT
in eine reelle Ganzzahl.
UPDATE: Angesichts der sich ändernden Umstände in den Kommentaren (d. h. das Präfix kann alles sein), müssen Sie ein LOCATE
in den Mix werfen:
ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);
Dies setzt natürlich voraus, dass das nicht-numerische Präfix keine Bindestriche enthält, der entsprechende Kommentar besagt jedoch Folgendes:
name
kann eine beliebige Buchstabenfolge sein
das sollte also eine sichere Annahme sein.
Sie können CAST () verwenden, um von string nach int zu konvertieren. z.B. SELECT CAST('123' AS INTEGER);
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
Verwenden Sie einfach CAST,
CAST(column_name AS UNSIGNED)
Der Typ für das Besetzungsergebnis kann einen der folgenden Werte annehmen:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
wenn Ihr Primärschlüssel eine Zeichenfolge in einem Format wie .__ ist.
ABC/EFG/EE/13/123 (Folgenummer)
Diese Art von Zeichenfolge kann leicht zum Sortieren mit dem Trennzeichen ("/") verwendet werden.
wir können die folgende Abfrage verwenden, um eine Tabelle mit diesem Schlüsseltyp zu bestellen
SELECT * FROM `TABLE_NAME` ORDER BY
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC
Um die Nummer zu erhalten, versuchen Sie es mit SUBSTRING_INDEX(field, '-', 1)
und konvertieren Sie es dann.
Eine generische Möglichkeit, dies zu tun:
SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
ein einfacher Weg SELECT '123' + 0