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?


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;

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.


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]

15

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


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;

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


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


-5

Eine generische Methode:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.