Javascript-Sortierung nach SQL Server-Sortierung

8

Kann mir jemand auf einen Sortieralgorithmus in Javascript verweisen, der genau so funktioniert wie SQL Server (für nvarchar / unicode-Spalten)?

Als Referenz finden Sie meine vorherige Frage zu diesem Verhalten hier: SQL Server 2008 - unterschiedliche Sortierreihenfolgen für VARCHAR vs NVARCHAR-Werte

Anstatt zu versuchen, das Sortierverhalten auf der Serverseite zu ändern, gibt es eine Möglichkeit, diese auf der Client-Seite anzupassen? Bei meiner vorherigen Frage ging es speziell um Bindestriche in Sortierreihenfolgen, aber ich gehe davon aus, dass es ein wenig mehr gibt, als Striche einfach zu ignorieren.

Ich habe hier einige zusätzliche Anwendungsfälle hinzugefügt, um das Problem besser zu veranschaulichen.

Beispieldaten wie aus SQL Server (2008) sortiert:

%Vor%

Wie kann ich Javascript erhalten, um die gleichen Werte auf die gleiche Weise zu sortieren?

Bitte lassen Sie mich wissen, wenn ich das weiter klären kann.

    
DanP 10.07.2010, 23:54
quelle

3 Antworten

6

Zuerst was ist Ihre Datenbanksortierung? Ich gehe davon aus, dass es SQL_Latin1_General_CP1_CS_AS oder SQL_Latin1_General_CP1_CI_AS ist. Wenn ja, dann sollte folgendes funktionieren (noch nicht vollständig getestet).

Es sieht so aus, als ob das Schreiben eines true Unicode-Sortierers ein großes Unterfangen ist. Ich habe Steuercodes gesehen, die einfacher waren als die Spezifikationen. ;-) Es scheint immer um Lookup-Tabelle (n) und mindestens eine 3-Level-Sortierung zu gehen - mit zu ändernden Zeichen und Kontraktionen.

Ich habe Folgendes auf Latin 1 , Latin Extended-A und Latin Extended-B Tabellen / Sortierung. Der Algorithmus sollte mit diesen Sets ziemlich gut funktionieren, aber ich habe ihn noch nicht vollständig getestet und die Zeichen nicht richtig berücksichtigt (um Geschwindigkeit und Komplexität zu sparen).

Sehen Sie in Aktion bei jsbin.com .

Funktion:

%Vor%

Test:

%Vor%

Ergebnisse:

%Vor%     
Brock Adams 16.07.2010, 15:28
quelle
2

Entschuldigung, JavaScript hat keine Sortierfunktionen. Der einzige String-Vergleich, den Sie erhalten, ist direkt auf den UTF-16-Code-Einheiten in String , wie von charCodeAt() zurückgegeben.

Für Zeichen innerhalb der Basic Multilingual Plane ist das das Gleiche wie bei einer binären Sortierung. Wenn Sie also JS und SQL Server zustimmen müssen (ignorieren Sie die Astralebenen sowieso), denke ich, dass Sie das nur tun können . (Kurz, um einen String-Collator in JS zu erstellen und die Kollationsregeln von SQL Server sorgfältig zu kopieren. Nicht viel Spaß dabei.)

(Was ist der Anwendungsfall, warum müssen sie übereinstimmen?)

    
bobince 11.07.2010 00:42
quelle
2

Die Antwort von @BrockAdams ist großartig, aber ich hatte ein paar Randfälle mit Bindestrichen in der Mitte des Strings Da ich nicht mit dem SQL-Server übereinstimmte, konnte ich nicht genau herausfinden, wo es schief gelaufen ist. Also schrieb ich eine funktionalere Version, die nur die ignorierten Zeichen herausfiltert und dann Arrays basierend auf den lateinischen Codepunkten vergleicht.

Es ist wahrscheinlich weniger performant, aber es gibt weniger Code zu verstehen und es funktioniert auf die Übereinstimmung der SQL-Testfälle, die ich unten hinzugefügt habe.

Ich habe eine SQL Server-Datenbank mit Latin1_General_100_CI_AS verwendet, daher wurde die Groß- und Kleinschreibung ignoriert, aber ich habe den Code hier für Groß- und Kleinschreibung beibehalten. Es ist einfach, zwischen Groß- und Kleinschreibung zu wechseln Wrapper-Funktion, die toLowerCase auf die Variablen anwendet.

Es gab keinen Unterschied in der Sortierung zwischen den beiden Sortierungen mit den Testfällen, die ich hatte.

%Vor%
    
icc97 03.02.2018 15:14
quelle