これは意味的には次と同じです。
And IH.CustomerItemNumber <> '' And IH.CustomerItemNumber Is Not Null
したがって、列がnullでも空の文字列でもないことを確認しています。重要かもしれません。
アップデート
この場合、文字列リテラル(空の文字列)の不等式を探しているため、少なくとも3つの意味的に正しいオプションがあります。
And IH.CustomerItemNumber <> ''
And IH.CustomerItemNumber <> '' And IH.CustomerItemNumber Is Not Null
And isnull(IH.CustomerItemNumber, '') <> ''
1つ目は、 ansi_nulls設定<> ''
に関係なく、nullと一致しないため、他の2つと同じ結果セットを返します。
開発システムでの簡単なテストでは、最初と2番目の両方がインデックスシークを利用しました。最初のテストは、いくつかの非常に単純化されたテストの1つで、2番目のテストをわずかに上回っています。
3つ目は、関数呼び出しを追加するため、他のインデックスのようにインデックスを使用しない可能性があるため、これはおそらく最悪の選択です。とはいえ、簡単なテストでは、isnullはインデックススキャンを使用できました。3番目の選択肢にさらに追加Is Not Null
すると、実際に速度が上がり、インデックスシークに移動しました。図に移動します(GO!GO!クエリオプティマイザ!)。
@Gordonと同様に、2番目のオプションもほとんどの場合選択します。これは、他の開発者(または自分自身)に対して自分の意図をより適切に示し、nullになる可能性のある別の列に対して同等性をチェックする場合に従う方がよいためです(考えてみてください)。潜在的なansi_nullsのオフ)。
完全を期すために:
And nullif(IH.CustomerItemNumber, '') is not null
And case when IH.CustomerItemNumber = '' then null else IH.CustomerItemNumber end is not null
And case IH.CustomerItemNumber when '' then null else IH.CustomerItemNumber end is not null
SQL Serverではすべて(私が知る限り)まったく同じように解釈され、上記の3番目のオプションと同じように実行されます。