2

ビット変数が 1 の場合にのみ where 句でフィールドを検索し、それ以外の場合は無視する状況があります。

@Active bit = 0

select * from Foo where firstname = 'xyz' and 

if(@active=1)

次に Active 列を検索します。それ以外の場合は、Active 列のフィルタリングを無視します。各パラメーターを個別にチェックしてから where 句を作成するのではなく、単純な条件でそれを行うにはどうすればよいですか

4

4 に答える 4

5

通常は単純なロジックで十分です。

select * from Foo where firstname = 'xyz' and
    (@Active = 0 or Active = <filter condition>)

任意の検索条件のコードを記述することに関する一般的なアドバイスについては、Erland Sommarskog のDynamic Search Conditions in T-SQL を読むよりも悪い結果になる可能性があります。

于 2013-10-01T14:14:49.783 に答える
0

どうですか:

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 の値を設定する必要があります。

于 2013-10-01T14:24:18.133 に答える
0

Active は、テーブルの実際の列でもあるようです。Case stmt を使用すると、このテーブルにある適切なインデックスが使用されるため、検索を効率的に行うことができます。

    DECLARE @Active BIT=0
    SELECT * 
    FROM Foo 
    WHERE firstname = 'a' 
    AND active = CASE WHEN @Active=1 THEN @Active ELSE Active END
于 2013-10-01T14:25:31.450 に答える