我遇到的情况是,只有当bit变量为1时我才想在where子句中搜索一个字段,否则忽略它。
@Active bit = 0
select * from Foo where firstname = 'xyz' and
if(@active=1)
然后搜索Active列,否则忽略Active列上的过滤。如何在一个简单的条件下,而不是单独检查每个参数,然后构建where子句
答案 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))