0

我有以下两个查询。第一个查询是直截了当的,当@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)
4

5 回答 5

5

你可以写

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

于 2013-08-14T10:38:00.013 回答
0

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

NULL=NULL - > false
NULL <> NULL -> false
于 2013-08-14T10:38:09.147 回答
0

为什么不直接使用

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

或者如果您寻求的是性能,请@MyParam使用IF声明进行检查

IF @MyParam IS NULL THEN
  SELECT * FROM @MyTable
ELSE
  SELECT * FROM @MyTable WHERE EmpID = @MyParam
于 2013-08-14T10:38:22.250 回答
0

我将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);
于 2013-08-14T10:55:44.927 回答
-1

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

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

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

于 2013-08-14T10:36:56.150 回答