Konvertieren Sie Text in eine Zahl in einer MySQL-Abfrage

136

Ist es möglich, Text innerhalb einer MySQL-Abfrage in Zahlen umzuwandeln? Ich habe eine Spalte mit einer Kennung, die 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 ist nach der Reihenfolge der Zeichen sortiert, d. H.

name-1
name-11
name-12
name-2

Wenn ich die Zahl abschneide, kann ich die 'varchar'-Zahl in die' echte 'Zahl umwandeln und damit die Zeilen sortieren? Ich möchte folgende Bestellung 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 Zahlen enthält, ist es dann sicher, diese Lösung zu verwenden?

czuk
quelle
1
Name ist genau Name oder kann es ein beliebiges Zeichen sein? Ich meine: Ist es eine vier Zeichen lange Zeichenfolge oder ein richtiger Name?
Marco
namekann eine beliebige Folge von Buchstaben sein.
Czuk
1
mögliches Duplikat der natürlichen MySQL-Sortierung
Shakti Singh

Antworten:

256

Das sollte funktionieren:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Marco
quelle
1
Können Sie der Dokumentation eine Erklärung und einen Link hinzufügen?
Angelo Fuchs
Mein String ist wie "name-abc12". Wenn Sie Ihren Code hinzufügen, funktioniert dies nur, wenn die Anfangszeichen nach "-" nicht mit einem Buchstaben beginnen. @Marco Kannst du mir einen Weg nennen, die Buchstaben ohne eine Where-Bedingung zu ignorieren?
Eduardo
1
@Eduardo meine Abfrage soll den String nach dem "-" abrufen und in eine Zahl umwandeln (es MUSS eine Zahl sein). In Ihrem Fall würde ich wahrscheinlich weiterhin einen regulären Ausdruck verwenden ...
Marco
@Marco regulärer Ausdruck hat es geschafft, danke für den Tipp.
Eduardo
32

Sie können verwenden SUBSTRINGund CONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

Wo name_columnist die Spalte mit den "name-" Werten. Das SUBSTRINGentfernt alles vor dem sechsten Zeichen (dh das Präfix "name-") und CONVERTkonvertiert dann das übrig gebliebene in eine echte Ganzzahl.

UPDATE : Angesichts der sich ändernden Umstände in den Kommentaren (dh das Präfix kann alles sein) müssen Sie ein LOCATEin die Mischung 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, aber der entsprechende Kommentar besagt Folgendes:

name kann eine beliebige Folge von Buchstaben sein

Das sollte also eine sichere Annahme sein.

mu ist zu kurz
quelle
Als er auf meinen Kommentar antwortete, sagte er uns, dass der Name eine beliebige Folge von Zeichen sein kann, daher bin ich mir nicht sicher, ob Sie ihn verwenden können SUBSTRING(name_column, 6). Ich weiß, du hast es gepostet, als er uns das nicht erzählt hat ...
Marco
@Marco: Danke für das Heads-up, ich habe ein Update hinzugefügt, das sich um die neuen Informationen zu den Präfixen kümmern soll. Aber ja, dein SUBSTRING_INDEX ist schöner.
Mu ist zu kurz
21

Verwenden Sie einfach CAST,

CAST(column_name AS UNSIGNED)

Der Typ für das Cast-Ergebnis kann einer der folgenden Werte sein:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
Sibin John Mattappallil
quelle
15

Mit CAST () können Sie von string nach int konvertieren. z.BSELECT CAST('123' AS INTEGER);

verdesmarald
quelle
14
Ist diese Version spezifisch? Ich muss es benutzen SELECT CAST('123' AS SIGNED INTEGER);oder SELECT CAST('123' AS UNSIGNED INTEGER);zum Laufen bringen.
Hobo
10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
Gaurav
quelle
1
Sind Sie sicher, dass ORDER BY num als Zahl verwendet, ohne CONVERT zu verwenden? Ich bin nicht sicher, aber es kann sein .. Ich frage mich nur :)
Marco
4

Ein einfacher Weg SELECT '123' + 0

VRK RAO
quelle
Obwohl dieser Code zur Lösung des Problems hilfreich sein kann, würde die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie er die Frage beantwortet, seinen langfristigen Wert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen.
Toby Speight
Dies beantwortete die Frage nicht, aber es war die Antwort, die ich suchte.
Sagar Shah
Ihre Lösung ist die eleganteste und praktischste - leider haben Sie sie im Kontext der Frage nicht mit einem bestimmten Ausdruck für ein bestimmtes Beispiel versehen - bitte ändern Sie sie, um sie spezifisch zu machen.
Chukko
2

Wenn Ihr Primärschlüssel eine Zeichenfolge in einem Format wie

ABC / EFG / EE / 13/123 (Sequenznummer) ist, kann
diese Art von Zeichenfolge problemlos zum Sortieren mit dem Trennzeichen ("/") verwendet werden.

Mit der folgenden Abfrage können wir eine Tabelle mit diesem Schlüsseltyp bestellen

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC
Harsha
quelle
0
cast(REGEXP_REPLACE(NameNumber, '[^0-9]', '') as UNSIGNED)
Jayram Kumar
quelle
-5

Eine generische Methode:

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