【问题标题】:conditional WHERE clause in TSQL, operators problemSQL中的条件WHERE子句,运算符问题
【发布时间】:2011-04-11 10:40:56
【问题描述】:

在 SQL Server 查询中,我希望有一个像这样的条件 WHERE 子句:

WHERE id_A = CASE WHEN @id != 0 THEN @id ELSE anything but @id END

我不知道如何编写ELSE 部分。在一种情况下,我需要 WHERE id_A = @id 但是 WHERE id_A != @idELSE

感谢您的帮助。

【问题讨论】:

    标签: sql-server tsql where


    【解决方案1】:

    尝试类似的方法:

    WHERE (@id != 0 AND id_A = @id) OR (@id = 0 AND id_A != @id)
    

    请注意,如果查询可能返回显着不同的行数,那么您应该考虑将其分成两个查询,以确保您对两个查询都有一个最佳查询计划,类似于:

    IF @id != 0 THEN
    BEGIN
        SELECT /* columns from table */
        WHERE id_A = @id
    END
    ELSE
    BEGIN
        SELECT /* columns from table */
        WHERE id_A != 0
    END
    

    不幸的是,这意味着复制其余的 SQL 查询,但是在一个变体返回大部分表而第一个变体只返回一行的情况下,它可能会执行得更好。

    【讨论】:

    • @Martin 谢谢 - 这将教我发布代码而不检查它是否实际运行!
    • 非常感谢 Kragen,您的“单线”解决方案非常适合我想做的事情,我没想过,但它终于很简单了
    【解决方案2】:

    假设id_a 不可为空

    WHERE  id_a = CASE
                    WHEN @id = 0 THEN CASE
                                        WHEN id_a <> 0 THEN id_a
                                      END
                    ELSE @id
                  END 
    

    应该这样做。除非您使用 OPTION RECOMPILEare on specific versions of SQL Server 2008,否则这将是低效的。

    【讨论】:

      【解决方案3】:
      --will match always (if id_A can not be NULL
      WHERE
          id_A = CASE WHEN @id <> 0 THEN @id ELSE id_A END
      
      -- will be false always
      WHERE
          id_A = CASE WHEN @id <> 0 THEN @id ELSE NULL END
      

      这些可以写成

       WHERE
          id_A = ISNULL(NULLIF(@id, 0), id_A)
      
       WHERE
          id_A = NULLIF(@id, 0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多