where子句中的位字段

时间:2013-10-01 14:12:32

标签: sql sql-server

我遇到的情况是,只有当bit变量为1时我才想在where子句中搜索一个字段,否则忽略它。

@Active bit = 0

select * from Foo where firstname = 'xyz' and 

if(@active=1)

然后搜索Active列,否则忽略Active列上的过滤。如何在一个简单的条件下,而不是单独检查每个参数,然后构建where子句

4 个答案:

答案 0 :(得分:5)

简单的逻辑通常就足够了:

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

关于为任意搜索条件编写代码的一般建议,你可能比阅读Erland Sommarskog的Dynamic Search Conditions in T-SQL

更糟糕

答案 1 :(得分: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的值。

答案 2 :(得分: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

答案 3 :(得分:0)

你可以写如下

 select * from Foo where firstname = 'xyz' and (@isactive=0 or (some conditions))