1. ホーム
  2. sql-server

[解決済み] SQL Server 2008 空文字列とスペースの比較

2023-06-24 03:35:12

質問

今朝、ちょっと変なことに遭遇したので、解説のために投稿してみようと思います。

次の SQL クエリを SQL 2008 に対して実行すると、なぜ 'equal' と表示されるのか、どなたか説明していただけませんか。 db 互換性レベルは 100 に設定されています。

if '' = ' '
    print 'equal'
else
    print 'not equal'

そして、これは0を返します。

select (LEN(' '))

スペースが自動的に切り取られているように見えます。 SQL Server の以前のバージョンではそうだったのかどうか見当もつきませんし、それをテストするためのものさえもう手元にありません。

私は、本番用クエリが不正な結果を返していたため、これに遭遇しました。 この動作はどこにも文書化されていません。

どなたかこれに関する情報をお持ちではないでしょうか。

どのように解決するのですか?

varchar と等号は、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