SQL CASE从SQL Server中的存储过程中的同一列检查两个条件

时间:2019-01-11 08:55:24

标签: sql-server

SQL CASE从同一列存储过程sql server中检查两个条件是否无效。

SELECT *
FROM TestTable
WHERE CASE WHEN ISNULL(column1,0)=0 THEN ISNULL(OfficeFlg,0)=1 ELSE ISNULL(column2,0)=1 END

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找

WHERE (column1 IS NULL AND OfficeFlg IS NOT NULL)
      OR
      (column1 IS NOT NULL AND column2 IS NOT NULL)

让我们看看您的案子,并尝试从中了解您的需求

CASE WHEN ISNULL(column1,0)=0 THEN ISNULL(OfficeFlg,0)=1 ELSE ISNULL(column2,0=1) END
  • WHEN ISNULL(column1,0)=0 THEN ISNULL(OfficeFlg,0)=1的意思是column1 IS NULL AND OfficeFlg IS NOT NULL

  • ELSE ISNULL(column2,0=1)的意思是column1 IS NOT NULL AND column2 IS NOT NULL

或者(可能是因为不清楚您到底想做什么)

WHERE (column1 IS NULL AND OfficeFlg =1 )
      OR
      (column1 IS NOT NULL AND column2 =1 )

答案 1 :(得分:3)

您正在尝试使用CASE表达式之类的CASE表达式;那不是他们的工作方式。

CASE表达式返回标量值,而不是布尔表达式的结果。如果我正确地理解了您的逻辑,那么您在布尔逻辑中所追求的将是:

SELECT *
FROM TestTable
WHERE ((Column1 = 0 OR Column1 IS NULL)
  AND  OfficFlg = 1)
   OR (Column1 != 0 AND Column2 = 1);

注意,我已删除了ISNULLCASE的使用。在WHERE中使用任何一个都使查询不可SARG,这可能会严重影响性能。对于类似ISNULL之类的事物,请使用IS NULLIS NOT NULL表达式,对于CASE,请使用带有ORAND的布尔逻辑。