webentwicklung-frage-antwort-db.com.de

Konvertieren Sie Text in eine Zahl in MySQL-Abfrage

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?

108
czuk

Das sollte funktionieren:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
219
Marco

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.

26
mu is too short

Sie können CAST () verwenden, um von string nach int zu konvertieren. z.B. SELECT CAST('123' AS INTEGER);

14
verdesmarald
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
10
Gaurav

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
2
Harsha

Um die Nummer zu erhalten, versuchen Sie es mit SUBSTRING_INDEX(field, '-', 1) und konvertieren Sie es dann.

2
user744116

Eine generische Möglichkeit, dies zu tun:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
0
Azzu

ein einfacher Weg SELECT '123' + 0

0
V R K RAO