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在 T-SQL 中的动态搜索条件做得更糟

于 2013-10-01T14:14:49.783 回答
0

你可以这样写

 select * from Foo where firstname = 'xyz' and (@isactive=0 or (some conditions))
于 2013-10-01T14:42:16.427 回答
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 回答
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 回答