Ich versuche, nach einer Zahlenspalte in meiner Datenbank mit den Werten 1-999 zu bestellen
Wenn ich benutze
ORDER_BY registration_no ASC
Ich bekomme….
1
101
102
103
104
105
106
107
108
109
11
110
Etc…
Es scheint also nach der ersten Ziffer im Gegensatz zur Nummer zu ordnen.
Weiß jemand, welches SQL zu verwenden ist, wenn ich dies nach Wert sortieren möchte? Also 1,2,3,4,5,6
etc.
sql
sql-order-by
Konnor262
quelle
quelle
order by registration_no + 0 asc
, um Ihr Problem zu lösen.Antworten:
Eine Möglichkeit, nach positiven ganzen Zahlen zu ordnen, wenn sie als gespeichert sind
varchar
, besteht darin, zuerst nach der Länge und dann nach dem Wert zu ordnen:Dies ist besonders nützlich, wenn die Spalte möglicherweise nicht numerische Werte enthält.
Hinweis: In einigen Datenbanken wird möglicherweise die Funktion zum Abrufen der Länge einer Zeichenfolge
length()
anstelle von aufgerufenlen()
.quelle
order by
hat wenig Einfluss auf die Leistung.length()
anstelle vonlen()
konvertiert den Wert explizit in eine Zahl. Eine andere Möglichkeit, dasselbe zu erreichen, wäre
Dies erzwingt ein implizites Gespräch.
Eigentlich sollten Sie die Tabellendefinition überprüfen und ändern. Sie können den Datentyp so ändern, dass er Ihnen
int
gefälltALTER TABLE your_table MODIFY COLUMN registration_no int;
quelle
Wenn Sie SQL Server verwenden:
quelle
gibt das gewünschte Ergebnis mit Warnungen.
Daher besser zu gehen
für ein sauberes Ergebnis ohne SQL-Warnungen.
quelle
Ich gehe davon aus, dass Ihr Spaltentyp STRING (CHAR, VARCHAR usw.) ist und die Sortierprozedur ihn als Zeichenfolge sortiert. Was Sie tun müssen, ist, den Wert in einen numerischen Wert umzuwandeln. Wie das geht, hängt vom verwendeten SQL-System ab.
quelle
Manchmal haben Sie einfach keine Wahl, Zahlen mit Text gemischt zu speichern. In einer unserer Anwendungen macht der Website-Host, den wir für unsere E-Commerce-Website verwenden, Filter dynamisch aus Listen. Es gibt keine Möglichkeit, nach einem anderen Feld als dem angezeigten Text zu sortieren. Wenn wir Filter wollten, die aus einer Liste erstellt wurden, die Dinge wie 2 "bis 8" 9 "bis 12" 13 "bis 15" usw. enthielt, brauchten wir sie, um 2-9-13 zu sortieren, nicht 13-2-9, wie es sein wird, wenn Lesen der numerischen Werte. Daher habe ich die SQL Server-Replikationsfunktion zusammen mit der Länge der längsten Nummer verwendet, um kürzere Nummern mit einem führenden Leerzeichen aufzufüllen. Jetzt werden 20 nach 3 sortiert und so weiter.
Ich habe mit einer Ansicht gearbeitet, die mir die minimalen und maximalen Längen, Breiten usw. für den Elementtyp und die Klasse angibt. Hier ist ein Beispiel dafür, wie ich den Text erstellt habe. (LB n Low und LB n High sind das Low- und High-Ende der 5 Längenklammern.)
quelle
Ich mache lieber ein "PAD" für die Daten. MySql nennt es LPAD, aber Sie können sich daran arbeiten, dasselbe in SQL Server zu tun.
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
Diese Formel liefert führende Nullen basierend auf der Spaltenlänge von 3. Diese Funktionalität ist in anderen Situationen außerhalb von ORDER BY sehr nützlich. Deshalb wollte ich diese Option bereitstellen.
Ergebnisse: 1 wird 001 und 10 wird 010, während 100 gleich bleibt.
quelle
Dieses Problem liegt nur daran, dass Sie die Spalte im Datentyp CHAR, VARCHAR oder TEXT deklariert haben. Ändern Sie einfach den Datentyp in INT, BIGINT usw. Dies löst das Problem Ihrer benutzerdefinierten Bestellung.
quelle