我有一种情况,只有当位变量为 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在 T-SQL 中的动态搜索条件做得更糟
你可以这样写
select * from Foo where firstname = 'xyz' and (@isactive=0 or (some conditions))
似乎 Active 也是您表中的实际列。使用 Case stmt 您可以提高搜索效率,因为它将使用您在此表上可能拥有的适当索引。
DECLARE @Active BIT=0
SELECT *
FROM Foo
WHERE firstname = 'a'
AND active = CASE WHEN @Active=1 THEN @Active ELSE Active END
怎么样:
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 的值。