2016-08-22 30 views
2

したがって、最近2つの値を比較するときにwierdバグが発生しました。T-SQL ORDER BYは "' - ' + ..."を無視しますが、 "'+' + ..."を無視します。

私の値は-1から2の範囲でした。 時々、-1が0より大きいと考えられましたが、解決は簡単でした。どうやらintの代わりにvarchar(50)に設定された列がありました。

しかし、これが原因で私はこのことが起こったと思いました。カラムがvarchar(50)に設定されていても、 ' - 'の値は '0'より小さい(charvalueは ' - 'は45、charvalueは '0'は48)。

ORDER BYが気にしていない唯一の文字は「 - 」だということが分かります。

例:

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 

結果:

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 

によって '+' オーダー(+ 43の対応するCharValueを持っている)右に感じるが、 ' - ' と思われます..間違っている
なぜこれがこのようなのですか?

追加情報

Serverバージョン:12.0.4213
照合:結果を歪める可能性が他に何Finnish_Swedish_CI_AS

見当もつかない。より多くの情報が必要かどうか尋ねます。

+0

恩赦自分の無知が、関数 '(x)は'(x)の ''とBは何ですか? –

+0

正常/予期した結果が得られます – Paparazzi

+0

AとBは作成された表の名前にすぎず、xは作成された表の単一列の名前です。私はそれをより明確にすることができた、申し訳ありません:P –

答えて

1

理由を知る。

TLDR:非ユニコードとユニコードの照合順序が異なるように ' - 'を並べ替えます。しかし、Unicodeデータのソートが特定のバージョンと 互換性があり、非Unicodeデータをソートするための

「SQL照合順序のルールは、Microsoft Windows オペレーティングシステムによって提供される任意の並べ替えルーチンと 互換性がありません 非UnicodeデータとUnicodeデータの比較ルールが異なるため、 SQL照合を使用すると、同じ文字の 比較で異なる結果が表示されることがあります( タイプ)。 SQL照合 "SQL_Latin1_General_CP1_CI_AS"を使用している場合、ハイフン( " - ")は "b"の前にある別の 文字としてソートされているため、Unicode文字列 'a-c'は文字列 'ab'よりも小さい です。ただし、これらの文字列 をUnicodeに変換して同じ比較を実行すると、ユニコード N'a-c 'はUnicode のソート規則では「単語の並べ替え」を使用するため、N'ab'よりも大きいと見なされます。

ソース」、ハイフンを無視します:https://support.microsoft.com/en-us/kb/322112

関連する問題