CASE无法正常工作

时间:2013-08-14 10:34:46

标签: sql-server

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

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

QUERY

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)

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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

答案 3 :(得分: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);

答案 4 :(得分:-1)

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

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

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