Ich habe Nummern VARCHAR
in einer MySQL-Datenbank gespeichert. Ich kann sie INT
aufgrund anderer Umstände nicht herstellen.
Beim Sortieren werden sie 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 eine geordnete Liste wie folgt angezeigt:
1 10 2 3 4 5 6 7 8 9
Wie kann ich es nach aufsteigenden Zahlen geordnet erscheinen lassen?
Antworten:
Wenn möglich, sollten Sie den Datentyp der Spalte in eine Zahl ändern, wenn Sie ohnehin nur Zahlen speichern.
Wenn Sie das nicht können, wandeln Sie Ihren Spaltenwert
integer
explizit in einen mit umoder implizit zum Beispiel mit einer mathematischen Operation, die eine Umwandlung in eine Zahl erzwingt
Übrigens konvertiert MySQL Zeichenfolgen von links nach rechts. Beispiele:
quelle
1
decimal
.Ein anderer Weg, ohne eine einzige Besetzung zu verwenden.
(Für Leute, die JPA 2.0 verwenden, wo kein Casting erlaubt ist)
BEARBEITEN: funktioniert nur für positive ganze Zahlen
quelle
Ein anderer und einfacher Weg
ORDER BY ABS(column_name)
quelle
Die Spalte, mit 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 diese ausgedacht.
Ergebnisse
Hoffe das hilft
quelle
1 - ISNUMERIC(ID)
anstelle von verwenden(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
, um 0 in 1 zu ändern und umgekehrt.Das funktioniert bei mir.
quelle
Ein anderer Weg zu konvertieren.
Wenn Sie ein Zeichenfolgenfeld haben, können Sie es oder seinen numerischen Teil folgendermaßen transformieren: Fügen Sie führende Nullen hinzu, damit alle ganzzahligen Zeichenfolgen gleich lang sind.
oder bestellen Sie nach einem Teil eines Feldes etwas wie 'tensymbols13', 'tensymbols1222' usw.
quelle
Ich habe auch nach Sortierfeldern mit Buchstabenpräfix gesucht. Hier ist, was ich die Lösung herausgefunden habe. Dies könnte helfen, wer nach der gleichen Lösung sucht.
Feldwerte:
SUBSTRING(field,3,9)
Ich setze 9, weil 9 für mich ausreichend ist, um maximal 9-stellige Ganzzahlwerte zu halten.Das Ergebnis ist also 123456789 123456788 123456787 ... 100 99 ... 2 1
quelle
Dies behandelt negative Zahlen, Brüche, Zeichenfolgen, alles:
quelle
Es könnte hilfreich sein, wer nach der gleichen Lösung sucht.
quelle
Wenn Sie AdonisJS verwenden und gemischte IDs wie ABC-202, ABC-201 ... haben, können Sie Rohabfragen mit Query Builder kombinieren und die obige Lösung implementieren ( https://stackoverflow.com/a/25061144/4040835 ). wie folgt:
HINWEISE: In dieser Zeile :
SUBSTRING(:sortField:,3,15)*1 ${sortDirection}
,Ref. 1: Weitere Informationen zu Parameterbindungen in Rohabfragen finden Sie hier: https://knexjs.org/#Raw-Bindings Ref. 2: Adonis-Rohabfragen: https://adonisjs.com/docs/4.1/query-builder# _raw_queries
quelle
Ändern Sie Ihr Feld so, dass es INT anstelle von VARCHAR ist.
Beheben Sie dann zuerst die entsprechenden Umstände. Andernfalls arbeiten Sie an dem eigentlichen zugrunde liegenden Problem. Die Verwendung eines MySQL CAST ist eine Option, maskiert jedoch Ihr fehlerhaftes Schema, das behoben werden sollte.
quelle