SQL ServerのINは内部でORにバラされる
IN句にNULLを入れると内部で列 = NULLという判定になってしまう
code:自分で書いたsql
(略) WHERE test_flag IN (1, 2, 3);
code:実行計画.sql
test_flag = 1
OR test_flag = 2
OR test_flag = 3
結果がNULLを許容する列の場合、注意
ANSI_NULLSがONの場合、NULLがすり抜ける
ANSI_NULLSがOFFの場合、NULLまで取得できてしまう
ANSI_NULLSに頼らず、きちんとNULLは対応した方が良い
SQL Server 2016の教科書 P144に書いてある
IN句の挙動はどうやって確認できる?
実行計画?
実行計画で確認できた
SQL Serverの実行計画からクエリとパラメーターをSQLで取得する
以下のクエリの実行計画を取得してみた
code:sql
SELECT id, name, test_flag FROM SAMPLE_TABLE WHERE test_flag IN (1, 2, 3);
それっぽい実行計画があった
code:実行計画.xml
<ScalarOperator ScalarString="
DATABASE.dbo.SAMPLE_TABLE.test_flag = 1
OR DATABASE.dbo.SAMPLE_TABLE.test_flag = 2
OR DATABASE.dbo.SAMPLE_TABLE.test_flag = 3">
そもそもNULLを何とかする
SQLアンチパターンのフィア・オブ・ジ・アンノウン