私は次のSQLを持っています:
CREATE TABLE tbFoo(
a varchar(50) NULL,
)
CREATE NONCLUSTERED INDEX IX_tbFoo_a ON tbFoo
(
a ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
insert into tbFoo select null
insert into tbFoo select 'test'
次の 2 つのクエリは正常に機能し、期待どおりにインデックスを使用します。
select * from tbFoo where a='test'
select * from tbFoo where a is null
さて、次のように、比較値を変数に格納したいとしましょう。
declare @a varchar(50)
select @a = NULL
「=」ではなく「is」演算子を使用する必要があるため、@a が null の場合、次のクエリは期待される結果を返しません。
select * from tbFoo where a=@a
以下は機能しますが、 @a が null の場合はテーブル スキャンを実行します (2 番目の括弧の評価を強制する 'test' 行のため)。
select * from tbFoo where (a is null and @a is null) or (a=@a)
最終的に、私はこの解決策を思いつきました。これはうまく機能し、私のインデックスを使用します:
select * from tbFoo where (a is null and @a is null) or (@a is not null and a=@a)
私の状況分析は正しいですか?
この状況を処理するより良い方法はありますか?