varchar
sと平等はTSQLでは厄介です。 LEN
関数は言う:
指定された文字列式のバイト数ではなく文字数を返します。末尾の空白を除く 。
DATALENGTH
を使用する必要があります 真のbyte
を取得するには 問題のデータの数。 Unicodeデータがある場合、この状況で得られる値はテキストの長さと同じではないことに注意してください。
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
式の同等性に関しては、次のように2つの文字列が同等であるかどうかが比較されます。
- 短い文字列を取得
- 空白のあるパッド 長さが長い文字列の長さと等しくなるまで
- 2つを比較する
予期しない結果を引き起こしているのは中間のステップです。そのステップの後、空白と空白を効果的に比較しているため、それらは等しいように見えます。
LIKE
=
よりも適切に動作します 「空白」の状況では、一致させようとしたパターンに対して空白のパディングが実行されないためです。
if '' = ' '
print 'eq'
else
print 'ne'
eq
を与えます 一方:
if '' LIKE ' '
print 'eq'
else
print 'ne'
ne
を提供します
LIKE
に注意してください ただし、対称ではありません。末尾の空白はパターン(RHS)で重要として扱われますが、一致式(LHS)では扱われません。以下はここから抜粋したものです:
declare @Space nvarchar(10)
declare @Space2 nvarchar(10)
set @Space = ''
set @Space2 = ' '
if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'
if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'
@Space Not Like @Space2
@Space2 Like @Space