Ich habe eine Datenbank mit einer VARCHAR-Spalte, die Ganzzahlen unterschiedlicher Länge enthält. Ich möchte sie sortieren, sodass 10 nach 9 und nicht nach 1 und 70A nach 70 kommt. Ich konnte dies mit PATINDEX () , einer CTE- und CASE-Anweisung in der WHERE-Klausel tun .
Ich habe mich jedoch gefragt, ob es eine Zusammenstellung gibt, bei der dies unnötig wäre.
sql-server
collation
sorting
natural-sort
Justin Dearing
quelle
quelle
Antworten:
Bei der Sortierung geht es um die alphabetische Sortierung, abhängig von Codepage, Akzent, Groß- / Kleinschreibung, Breite und Kana. Zahlenzeichen (0-9) haben keine ihrer Eigenschaften.
So
9
ist immer10B
in irgendeiner Art nach.Sie müssen es wie angegeben aufteilen
oder wiefolgtsortieren:Die Länge auf der rechten Seite bestimmt, wie viele Leerzeichen Sie haben.Sie könnten natürlich:
right justify in a char (eine gespeicherte Version meines RECHTS oben)Die letzten 2 Vorschläge sind wie meine RECHTEN oben und etwas anders. Schneller zu sortieren (keine Verarbeitung der Colukmn erforderlich), aber mehr Speicherplatz erforderlich
quelle
9
ist es10B
in jeder Hinsicht immer nach ": Dies ist in SQL Server nur der Fall, da die zugrunde liegende Sortieroption für "DigitsAsNumbers" nicht als Sortieroption verfügbar gemacht wurde. Noch ;-). Dies wurde für Windows-basierte Apps ab Windows 7 verfügbar, insbesondere im Datei-Explorer. Und es kann eines Tages zu SQL Server ausgesetzt werden, wenn genügend Menschen die Idee unterstützen. Ich habe versucht, den Ball ins Rollen zu bringen, indem ich den folgenden Connect-Vorschlag eingereicht habe : Unterstütze "natürliche Sortierung" / DIGITSASNUMBERS als Sortieroption .Ich würde eine berechnete Spalte einrichten und danach sortieren. Etwas wie
Verwenden Sie dann diese Spalte zum Sortieren, da Sie die Spalte jetzt indizieren können.
quelle
Wenn Sie auf schmerzhafte Weise beweisen möchten, was @gbn sagt (im Wesentlichen, dass Sie einer Kollatierung nicht anweisen können, Teilzeichenfolgen anders zu ordnen), können Sie eine schnelle #temp-Tabelle mit einem Koeffizienten für die erwartete Reihenfolge erstellen und prüfen, ob Wenn Sie nach einer Sortierung bestellen, wird dieselbe Reihenfolge zurückgegeben:
Dies dauert für mich ungefähr 10 Sekunden und ergibt 0 Zeilen - was bedeutet, dass keine für SQL Server verfügbare Kollatierung (mindestens 2008 R2, Denali nicht ausprobiert) wie erwartet sortiert wird. Sie benötigen eine andere Methode, um die Sortierung zu definieren.
quelle
Möchten Sie eine sinnvolle und effiziente Methode zum Sortieren von Zahlen in Zeichenfolgen als tatsächliche Zahlen? Erwägen Sie, für meinen Microsoft Connect-Vorschlag zu stimmen: Unterstützen Sie "Natural Sorting" / DIGITSASNUMBERS als Sortieroption
Obwohl diese Frage spezifisch für SQL Server ist und diese Antwort nicht, war ich der Meinung, dass ich diese Informationen dennoch veröffentlichen sollte, um das Bewusstsein dafür zu schärfen und um keine der anderen Antworten zu beanstanden.
Abgesehen davon ist es außerhalb von SQL Server in bestimmten Umgebungen möglich, diese Art der Sortierung durchzuführen. Dies ist zumindest in der Unicode-Dokumentation festgelegt. In dem UNICODE - Locale Auszeichnungssprache (LDML) TEIL 5: COLLATION Standard / Bericht gibt es ein Diagramm für Sortierungseinstellungen , die für die Anpassung der Sortierverhalten verschiedene Optionen beschrieben. Eine der Optionen ist
-kn-true
oder[numericOrdering on]
:Dieses Dokument ist jedoch ein "technischer Standard" und nicht Teil der Kernspezifikation von Unicode. Ein Hinweis oben im Dokument besagt:
Daher ist dieses spezielle Verhalten in SQL Server oder sogar in .NET (zumindest nicht nativ) nicht verfügbar, obwohl beide der Kernspezifikation von Unicode entsprechen.
Das ICU- Projekt (International Components for Unicode) besteht aus einer Reihe von C / C ++ - und Java-Bibliotheken, die diese Funktionalität implementieren, und es gibt sogar eine Online-Demo davon. Unter "Verwandte Projekte" befindet sich eine Verknüpfung zu einem .NET-Projekt, das ein COM-Objektwrapper für die ICU-Bibliothek zu sein scheint, mit dem diese Funktionalität für verwalteten Code verfügbar gemacht werden kann. Es ist jedoch nicht klar, ob das .NET-Projekt noch aktiv ist.
Um dieses Verhalten in Aktion zu sehen, rufen Sie die ICU-Kollatierungsdemo auf .
Fügen Sie Folgendes in den Eingabetextbereich auf der linken Seite ein:
Setze alle Optionen auf "default". Aktivieren Sie die Option "Zeilennummern eingeben" rechts neben der sortSchaltfläche und stellen Sie sicher, dass die Option "Diff Strengths" deaktiviert ist.
Klicken Sie auf die sortSchaltfläche und Sie sollten Folgendes zurückbekommen:
Dies ist zu erwarten, wenn eine typische Zeichenfolgensortierung durchgeführt wird und was in SQL Server angezeigt wird.
In der Reihe der Optionsfelder direkt über der sortSchaltfläche ist die zweite Zeile mit "numerisch" gekennzeichnet. Aktivieren Sie das Optionsfeld "Ein".
Klicken Sie erneut auf die sortSchaltfläche, und Sie sollten Folgendes zurückerhalten:
Frage, ob dies funktioniert, wenn sich der numerische Teil in der Mitte der Zeichenfolge befindet? Ok, fügen Sie Folgendes in den Eingabetextbereich auf der linken Seite ein (ersetzen Sie die vorherige Liste):
Stellen Sie sicher, dass die numerische Einstellung weiterhin auf "Ein" gesetzt ist. Klicken Sie erneut auf die sortSchaltfläche, und Sie sollten Folgendes zurückerhalten:
Möchten Sie dies an einem anderen Ort sehen? Erstellen Sie einen Ordner auf Ihrer Festplatte, etwa C: \ temp \ sorting \ , und erstellen Sie leere Dateien mit denselben "Script -..." -Namen. Wenn Sie
DIR
in einem Befehlsfenster einen Befehl ausführen, wird die Standardsortierung angezeigt. Wenn Sie sich die Liste der Dateien im Windows Explorer ansehen, sehen Sie die Liste sortiert nach der Option "numerisch" :-).quelle