【问题标题】:Bit field in where clausewhere 子句中的位域
【发布时间】:2013-10-01 14:12:31
【问题描述】:

我有一种情况,只有当位变量为 1 时,我才想在 where 子句中搜索字段,否则忽略它。

@Active bit = 0

select * from Foo where firstname = 'xyz' and 

if(@active=1)

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

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

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

    对于为任意搜索条件编写代码的一般建议,您可以比阅读 Erland Sommarskog 的 Dynamic Search Conditions in T-SQL 做得更糟

    【讨论】:

      【解决方案2】:

      看起来 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】:

        怎么样:

        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 的值。

        【讨论】:

          【解决方案4】:

          你可以这样写

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-08
            相关资源
            最近更新 更多