5

誰かがこれを説明できますか:

SELECT 
  CASE WHEN CAST('iX' AS nvarchar(20)) 
      > CAST('-X' AS nvarchar(20)) THEN 1 ELSE 0 END,
  CASE WHEN CAST('iX' AS varchar(20)) 
      > CAST('-X' AS varchar(20)) THEN 1 ELSE 0 END

結果: 0 1

SELECT 
  CASE WHEN CAST('i' AS nvarchar(20)) 
      > CAST('-' AS nvarchar(20)) THEN 1 ELSE 0 END,
  CASE WHEN CAST('i' AS varchar(20)) 
      > CAST('-' AS varchar(20)) THEN 1 ELSE 0 END

結果: 1 1

最初のクエリでは、nvarchar()結果は私が期待しているものではありませんが、それでも削除すると、X期待どおりにnvarchar()並べ替えが行われます。

(私の元のクエリでは、''N''リテラル構文を使用して、varchar()nvarchar()ではなくCAST()、同じ結果が得られました。)

データベースの照合設定はですSQL_Latin1_General_CP1_CI_AS

4

2 に答える 2

9

Unicodeテキストを比較する場合、ハイフンは特別に扱われます。Unicodeの比較では、ハイフンを無視する「辞書の順序」を使用します。これは、非ユニコードのテキスト比較には当てはまりません。

とを比較することは、-Xとを比較することにiX似ているため、左側の方が大きくなります。「-」と「i」を比較する場合、「」と「i」を比較するのと同じであるため、「i」の方が右側が大きくなります。XiX-X

MSDNから、

Unicode以外のデータを並べ替えるためのSQL照合の規則は、MicrosoftWindowsオペレーティングシステムによって提供される並べ替えルーチンと互換性がありません。ただし、Unicodeデータの並べ替えは、Windowsの特定のバージョンの並べ替えルールと互換性があります。非UnicodeデータとUnicodeデータの比較ルールが異なるため、SQL照合を使用すると、基になるデータ型に応じて、同じ文字の比較で異なる結果が表示される場合があります。たとえば、SQL照合「SQL_Latin1_General_CP1_CI_AS」を使用している場合、ハイフン( "-")は "b"の前にある個別の文字としてソートされるため、非Unicode文字列'ac'は文字列'ab'よりも小さくなります。 。でも、

SELCT body From MSDN_Articles WHERE url IN(" http://support.microsoft.com/kb/322112 ")

于 2010-06-16T21:09:24.053 に答える
1

いい質問です!

調べてみると、この問題はハイフンとアポストロフィに関連していることがわかりました。あなたの例は、「-X」と同じ「奇妙な」振る舞いを示しています。

SQLの並べ替えとハイフンがここにあるので、答えを見つけたとは言えません。

于 2010-06-16T21:21:18.483 に答える