【问题标题】:CASE is not working properly [duplicate]案例无法正常工作[重复]
【发布时间】:2013-08-14 10:34:46
【问题描述】:

我有以下两个问题。第一个查询是直截了当的,当 @MyParam 为空时,它作为 epecte 工作。但是第二个查询没有返回相同的结果。第二个查询中的错误是什么。

注意:我被要求使用第二种方法,因为客户要求摆脱“@MyParam IS NULL”检查(用于查询 1)

查询

DECLARE @MyParam INT

DECLARE @MyTable TABLE (EmpID INT)

INSERT INTO @MyTable VALUES (1)
INSERT INTO @MyTable VALUES (2)
INSERT INTO @MyTable VALUES (3)
INSERT INTO @MyTable VALUES (4)

--Query 1
SELECT * 
FROM @MyTable M
WHERE M.EmpID = @MyParam OR @MyParam IS NULL

-- Query 2 (Rewrite for performance)
SELECT * 
FROM @MyTable M
WHERE M.EmpID = (CASE @MyParam WHEN NULL THEN M.EmpID ELSE @MyParam END)

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    你可以写

    SELECT * 
    FROM @MyTable M
    WHERE M.EmpID = IsNULL(@MyParam,M.EmpID)
    

    或者如果您出于其他原因需要使用case

    WHERE M.EmpID = (CASE WHEN @MyParam IS NULL THEN M.EmpID ELSE @MyParam END)
    

    机箱工作正常。选择没有损坏。 http://pragmatictips.com/26

    【讨论】:

    【解决方案2】:

    您应该使用 IS NOT NULL。永远不要将 NULL 与任何东西进行比较

    NULL=NULL - > false
    NULL <> NULL -> false
    

    【讨论】:

    • 这并不总是正确的。
    • IS 关键字是一个比较器 ...
    【解决方案3】:

    为什么不直接使用

    SELECT * 
    FROM @MyTable M
    WHERE M.EmpID = ISNULL(@MyParam, M.EmpID)
    

    或者如果您寻求的是性能,请使用 IF 语句检查 @MyParam

    IF @MyParam IS NULL THEN
      SELECT * FROM @MyTable
    ELSE
      SELECT * FROM @MyTable WHERE EmpID = @MyParam
    

    【讨论】:

      【解决方案4】:

      我会为此使用coalesce()。它是短路的 ANSI 标准方法:

      SELECT m.* 
      FROM @MyTable m
      WHERE m.EmpID = coalesce(@MyParam, m.EmpID);
      

      请注意,此逻辑与第一种方法略有不同,在 m.EmpId 为NULL 的情况下。等效的逻辑是:

      SELECT m.* 
      FROM @MyTable m
      WHERE m.EmpID = coalesce(@MyParam, m.EmpID) or (m.EmpId is NULL and @MyParam is NULL);
      

      【讨论】:

        【解决方案5】:

        语法是CASE WHEN @MyParam IS NULL THEN M.EmpID ELSE @MyParam END

        请在此处查看类似的答案:

        https://stackoverflow.com/a/3237670/11436

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-30
          • 1970-01-01
          • 2017-07-15
          • 2015-09-06
          • 2016-05-06
          • 2016-05-12
          • 2018-07-19
          • 2018-10-21
          相关资源
          最近更新 更多