Natürliche (menschliche alphanumerische) Sortierung in Microsoft SQL 2005

Wir haben eine große Datenbank, auf der wir DB-seitige Paginierung haben. Dies geht schnell und gibt eine Seite mit 50 Zeilen aus Millionen von Datensätzen in einem Bruchteil einer Sekunde zurück.

Benutzer können ihre eigene Sortierung definieren, indem sie grundsätzlich auswählen, nach welcher Spalte sortiert werden soll. Spalten sind dynamisch - manche haben numerische Werte, manche Datumsangaben und manche Textangaben.

Während die meisten wie erwartet sortieren, wird der Text dumm sortiert. Nun, ich sage dumm, es macht Sinn für Computer, aber frustriert die Benutzer.

Zum Beispiel ergibt das Sortieren nach einer Zeichenfolgendatensatz-ID Folgendes:

rec1
rec10
rec14
rec2
rec20
rec3
rec4

...und so weiter

Ich möchte, dass dies die Nummer berücksichtigt, also:

rec1
rec2
rec3
rec4
rec10
rec14
rec20

Ich kann die Eingabe nicht steuern (andernfalls würde ich sie nur in führenden Tausendern formatieren) und ich kann mich nicht auf ein einziges Format verlassen - einige sind Dinge wie "{alpha code} - {dept code} - {rec id}" .

Ich kenne einige Möglichkeiten, um dies in C # zu tun, kann aber nicht alle Datensätze zum Sortieren abrufen, da dies zu langsam wäre.

Weiß jemand einen Weg, um schnell eine natürliche Art in SQL Server anzuwenden?

Wir verwenden:

ROW_NUMBER() over (order by {field name} asc)

Und dann blättern wir damit.

Wir können Trigger hinzufügen, obwohl wir dies nicht tun würden. Alle ihre Eingaben sind parametrisiert und dergleichen, aber ich kann das Format nicht ändern - wenn sie "rec2" und "rec10" eingeben, erwarten sie, dass sie einfach so und in natürlicher Reihenfolge zurückgegeben werden.

Wir haben gültige Benutzereingaben, die für verschiedene Clients unterschiedlichen Formaten entsprechen.

One könnte gehen rec1, rec2, rec3, ... rec100, rec101

Während andere gehen könnten: grp1rec1, grp1rec2, ... grp20rec300, grp20rec301

Wenn ich sage, dass wir die Eingabe nicht steuern können, kann ich Benutzer nicht zwingen, diese Standards zu ändern. Sie haben einen Wert wie grp1rec1 und ich kann sie nicht in grp01rec001 umformatieren, da dies etwas ändern würde, das für Lookups verwendet wird und Verknüpfung mit externen Systemen.

Diese Formate sind sehr unterschiedlich, bestehen jedoch häufig aus einer Mischung aus Buchstaben und Zahlen.

Diese in C # zu sortieren ist einfach - teilen Sie es einfach in @ au{ "grp", 20, "rec", 301 } und dann die Sequenzwerte der Reihe nach vergleichen.

Wie auch immer es Millionen von Datensätzen gibt und die Daten ausgelagert werden, muss die Sortierung auf dem SQL-Server erfolgen.

SQL Server sortiert nach Wert, nicht nach Vergleich - in C # kann ich die zu vergleichenden Werte aufteilen, aber in SQL benötige ich eine Logik, die (sehr schnell) einen einzelnen Wert erhält, der konsistent sortiert.

oebius - Ihre Antwort mag funktionieren, aber es scheint ein hässlicher Kompromiss zu sein, für all diese Textwerte einen Sortierschlüssel hinzuzufüge

Antworten auf die Frage(26)

Ihre Antwort auf die Frage