2016-08-22 1 views
2

J'ai donc récemment rencontré un bogue bizarre lors de la comparaison de deux valeurs.T-SQL ORDER BY ignore "'-' + ..." mais pas "'+' + ..."

Mes valeurs étaient comprises entre -1 et 2. Quelquefois, on pensait que -1 était supérieur à 0, la solution était facile. Apparemment, la colonne était définie sur varchar (50) au lieu de int.

Mais cela m'a fait penser pourquoi cela est arrivé. Parce que même si la colonne a été définie à varchar (50), le '-' devrait avoir une valeur char inférieure à '0' (charvalue pour '-' est 45 et charvalue pour '0' devrait être 48)

quelques tests et il s'avère, ce que je peux trouver, que '-' est le seul caractère que ORDER BY ne se soucie pas.

Exemple:

SELECT 
    A.x 
FROM 
    (
     VALUES 
      ('-5'), ('-4'), ('-3'), ('-2'), ('-1'), 
      ('0'), ('1'), ('2'), ('3'), ('4'), ('5') 
    ) A(x) 
ORDER BY 
    A.x; 

SELECT 
    B.x 
FROM 
    (
     VALUES 
      ('+5'), ('+4'), ('+3'), ('+2'), ('+1'), 
      ('0'), ('1'), ('2'), ('3'), ('4'), ('5') 
    ) B(x) 
ORDER BY 
    B.x 

Résultat:

Result of A 
0 
1 
-1 
2 
-2 
3 
-3 
4 
-4 
5 
-5 

Result of B 
+1 
+2 
+3 
+4 
+5 
0 
1 
2 
3 
4 
5 

(+ a une charValue de 43)

Le '+' order by sent droit, mais le '-' semble .. mauvais
Quelqu'un sait pourquoi c'est comme ça?

Informations complémentaires

version Server: 12.0.4213
Collation: Finnish_Swedish_CI_AS

Aucune idée de ce qui pourrait fausser le résultat d'autre. Demandez si vous avez besoin de plus d'informations.

+0

Excusez mon ignorance, mais quelles sont les fonctions' A (x) 'et' B (x) '? –

+0

J'obtiens des résultats normaux/attendus – Paparazzi

+0

Les lettres A et B sont juste des noms pour les tables créées et x est le nom de la colonne unique dans la table créée. J'aurais pu le rendre plus clair, désolé: P –

Répondre

1

Découvrez pourquoi.

TLDR: Le classement non-unicode et unicode trie différemment '-'.

« Une des règles de classement SQL pour trier les données non-Unicode sont incompatibles avec une routine de tri qui est fourni par le système d'exploitation Microsoft Windows , mais le tri des données Unicode est compatible avec une version particulière de Étant donné que les règles de comparaison pour les données non Unicode et Unicode sont différentes, lorsque vous utilisez un classement SQL, vous pouvez voir des résultats différents pour les comparaisons des mêmes caractères, en fonction du type de données sous-jacentes . , si vous utilisez le classement SQL "SQL_Latin1_General_CP1_CI_AS", le La chaîne Unicode 'a-c' est moins que la chaîne 'ab' car le trait d'union ("-") est trié comme un caractère distinct qui précède "b". Toutefois, si vous convertissez ces chaînes en Unicode et que vous effectuez la même comparaison, la chaîne Unicode N'a-c 'est considérée comme supérieure à N'ab' car les règles de tri Unicode utilisent un «tri des mots» qui ne tient pas le trait d'union «

Source:. https://support.microsoft.com/en-us/kb/322112