4

Je fais des recherches pour un système existant qui a SQL Server comme backend. Nous commençons à stocker des données de titre d'article ad-hoc dans plusieurs langues (y compris la langue russe en caractères cyrilliques et d'autres langues européennes). Ma question est de trier ces données, quelles sont mes options pour changer l'ordre de tri à la demande sans changer le classement? Puis-je décider du classement dans la requête elle-même?Modifier le classement lors d'une requête dans SQL Server? Tri approprié pour les langues anglais/cyrillique/UE

Voici une exemple de requête que je joue avec pour essayer de voir:

SELECT STR FROM (
SELECT N'а01' AS STR UNION 
SELECT N'б02' AS STR UNION 
SELECT N'в03' AS STR UNION 
SELECT N'г04' AS STR UNION 
SELECT N'д05' AS STR UNION 
SELECT N'е06' AS STR UNION 
SELECT N'ё07' AS STR UNION 
SELECT N'ж08' AS STR UNION 
SELECT N'з09' AS STR UNION 
SELECT N'и10' AS STR UNION 
SELECT N'й11' AS STR UNION 
SELECT N'к12' AS STR UNION 
SELECT N'л13' AS STR UNION 
SELECT N'м14' AS STR UNION 
SELECT N'н15' AS STR UNION 
SELECT N'о16' AS STR UNION 
SELECT N'п17' AS STR UNION 
SELECT N'р18' AS STR UNION 
SELECT N'с19' AS STR UNION 
SELECT N'т20' AS STR UNION 
SELECT N'у21' AS STR UNION 
SELECT N'ф22' AS STR UNION 
SELECT N'х23' AS STR UNION 
SELECT N'ц24' AS STR UNION 
SELECT N'ч25' AS STR UNION 
SELECT N'ш26' AS STR UNION 
SELECT N'щ27' AS STR UNION 
SELECT N'ъ28' AS STR UNION 
SELECT N'ы29' AS STR UNION 
SELECT N'ь30' AS STR UNION 
SELECT N'э31' AS STR UNION 
SELECT N'ю32' AS STR UNION 
SELECT N'я33' AS STR UNION 
SELECT N'a34' AS STR UNION 
SELECT N'b35' AS STR UNION 
SELECT N'c36' AS STR UNION 
SELECT N'd37' AS STR UNION 
SELECT N'e38' AS STR UNION 
SELECT N'f39' AS STR UNION 
SELECT N'g40' AS STR UNION 
SELECT N'h41' AS STR UNION 
SELECT N'i42' AS STR UNION 
SELECT N'j43' AS STR UNION 
SELECT N'k44' AS STR UNION 
SELECT N'l45' AS STR UNION 
SELECT N'm46' AS STR UNION 
SELECT N'n47' AS STR UNION 
SELECT N'o48' AS STR UNION 
SELECT N'p49' AS STR UNION 
SELECT N'q50' AS STR UNION 
SELECT N'r51' AS STR UNION 
SELECT N's52' AS STR UNION 
SELECT N't53' AS STR UNION 
SELECT N'u54' AS STR UNION 
SELECT N'v55' AS STR UNION 
SELECT N'w56' AS STR UNION 
SELECT N'x57' AS STR UNION 
SELECT N'y58' AS STR UNION 
SELECT N'z59' AS STR UNION 
SELECT N'A60' AS STR UNION 
SELECT N'B70' AS STR UNION 
SELECT N'C71' AS STR UNION 
SELECT N'D72' AS STR UNION 
SELECT N'E73' AS STR UNION 
SELECT N'F74' AS STR UNION 
SELECT N'G75' AS STR UNION 
SELECT N'H76' AS STR UNION 
SELECT N'I77' AS STR UNION 
SELECT N'J78' AS STR UNION 
SELECT N'K79' AS STR UNION 
SELECT N'L80' AS STR UNION 
SELECT N'M81' AS STR UNION 
SELECT N'N82' AS STR UNION 
SELECT N'O83' AS STR UNION 
SELECT N'P84' AS STR UNION 
SELECT N'Q85' AS STR UNION 
SELECT N'R86' AS STR UNION 
SELECT N'S87' AS STR UNION 
SELECT N'T88' AS STR UNION 
SELECT N'U89' AS STR UNION 
SELECT N'V90' AS STR UNION 
SELECT N'W91' AS STR UNION 
SELECT N'X92' AS STR UNION 
SELECT N'Y93' AS STR UNION 
SELECT N'Z94' AS STR 
) AS SUBTABLE 
ORDER BY STR ASC 

L'ordre que je reçois est ceci:

a34 
A60 
b35 
B70 
c36 
C71 
d37 
D72 
e38 
E73 
f39 
F74 
g40 
G75 
h41 
H76 
i42 
I77 
j43 
J78 
k44 
K79 
l45 
L80 
m46 
M81 
n47 
N82 
o48 
O83 
p49 
P84 
q50 
Q85 
r51 
R86 
s52 
S87 
t53 
T88 
u54 
U89 
v55 
V90 
w56 
W91 
x57 
X92 
y58 
Y93 
z59 
Z94 
а01 
б02 
в03 
г04 
д05 
е06 
ё07 
ж08 
з09 
и10 
й11 
к12 
л13 
м14 
н15 
о16 
п17 
р18 
с19 
т20 
у21 
ф22 
х23 
ц24 
ч25 
ш26 
щ27 
ъ28 
ы29 
ь30 
э31 
ю32 
я33 

Il ressemble à certains des caractères cyrilliques sont similaires à leurs équivalents anglais, y a-t-il des façons d'avoir ces entrelacés dans le cadre de «A à Z»?

Quelles autres options de tri sont disponibles dans SQL Server?

Si je ne peux pas le faire dans la requête, quel est le classement le plus robuste à sélectionner par colonne?

+0

Quel est le sens de l'entrelacement des caractères cyrilliques avec les caractères latins? La commande est finalement montrer selon une comparaison sous-jacente. Et quel est le sens de comparer bleu avec chaud? –

+0

Je vois un personnage comme ''' et ça me ressemble vraiment. Mais il semble ne pas être. Je me demande si, dans une liste de noms ou de titres contenant des données hétérogènes, j'ai le choix de décider si deux glyphes similaires peuvent être ordonnés de la même façon. Je ne dirais pas que c'est comparer le bleu avec le chaud, plus comme demander si dans un algorithme de tri disponible pour moi j'ai cette option. Pardonnez-moi si c'est une question stupide. – artlung

Répondre

10

Vous pouvez sélectionner une collation cyrillique comme:

order by STR collate Cyrillic_General_CI_AI 

Une liste complète des classements peut être trouvé avec un appel à:

select * from ::fn_helpcollations() 

CS signifie Sensible à la casse, AI signifie accent.