ビット変数が 1 の場合にのみ where 句でフィールドを検索し、それ以外の場合は無視する状況があります。
@Active bit = 0
select * from Foo where firstname = 'xyz' and
if(@active=1)
次に Active 列を検索します。それ以外の場合は、Active 列のフィルタリングを無視します。各パラメーターを個別にチェックしてから where 句を作成するのではなく、単純な条件でそれを行うにはどうすればよいですか
ビット変数が 1 の場合にのみ where 句でフィールドを検索し、それ以外の場合は無視する状況があります。
@Active bit = 0
select * from Foo where firstname = 'xyz' and
if(@active=1)
次に Active 列を検索します。それ以外の場合は、Active 列のフィルタリングを無視します。各パラメーターを個別にチェックしてから where 句を作成するのではなく、単純な条件でそれを行うにはどうすればよいですか
通常は単純なロジックで十分です。
select * from Foo where firstname = 'xyz' and
(@Active = 0 or Active = <filter condition>)
任意の検索条件のコードを記述することに関する一般的なアドバイスについては、Erland Sommarskog のDynamic Search Conditions in T-SQL を読むよりも悪い結果になる可能性があります。
どうですか:
DECLARE @Active bit
if @Active = 1
BEGIN
(select * from Foo where firstname = 'bar' and Active = --condition)
END
else
BEGIN
(select * from Foo where firstname = 'bar')
END
if...elseもちろん、宣言とステートメントの間のどこかに @Active の値を設定する必要があります。
Active は、テーブルの実際の列でもあるようです。Case stmt を使用すると、このテーブルにある適切なインデックスが使用されるため、検索を効率的に行うことができます。
DECLARE @Active BIT=0
SELECT *
FROM Foo
WHERE firstname = 'a'
AND active = CASE WHEN @Active=1 THEN @Active ELSE Active END