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