在where子句中使用case的正确方法是什么

时间:2014-07-31 12:47:39

标签: sql sql-server

我收到此错误"'<'"附近的语法不正确。"。在where子句中使用大小写,比较运算符的正确方法是什么?

这是我的Sql查询:

SELECT COUNT(AL.PKAPPLICATIONID) FROM APPLICATIONLOGO AL 
LEFT JOIN THIRDPARTYSESSIONKEY TSK ON AL.PKAPPLICATIONID = TSK.APPLICATIONSOURCEID WHERE
CASE WHEN TSK.CREATEDON IS  NULL 
THEN TSK.CREATEDON < GETDATE()
ELSE 1=1
END

3 个答案:

答案 0 :(得分:3)

使用OR

SELECT Count(AL.Pkapplicationid) 
FROM   APPLICATIONLOGO AL 
       LEFT JOIN THIRDPARTYSESSIONKEY TSK 
              ON AL.Pkapplicationid = TSK.Applicationsourceid 
WHERE TSK.Createdon IS NULL  
  OR  TSK.Createdon < Getdate() 

我认为这是实际的逻辑,因为你的不合理:

WHEN TSK.Createdon IS NULL THEN TSK.Createdon < Getdate() 

或者你真的想在Createdon IS NULL的情况下使用不同的列吗?

然后您可以使用COALESCE / ISNULL

WHERE COALESCE(TSK.Createdon, TSK.OtherColumn) < Getdate() 

答案 1 :(得分:1)

这是您的where条款:

WHERE CASE WHEN TSK.CREATEDON IS  NULL THEN TSK.CREATEDON < GETDATE() ELSE 1=1
      END

我认为你的意思是IS NOT NULL;否则逻辑没有多大意义。

通常,在case子句中使用where的最佳方法是避免它。以下内容更易于阅读,可能更符合您的意图:

WHERE TSK.CREATEDON IS NULL OR TSK.CREATEDON < GETDATE()

您的版本的原始逻辑很简单:

WHERE TSK.CREATEDON IS NOT NULL

而且,您问题的具体答案是case语句返回值,而布尔结果不是值。因此,以下内容不起作用:

where (case when c = 'a' then a = b else c = b end)

以下是:

where (case when c = 'a' then a else c end) = b

但正如我所说,在大多数情况下,最好只使用基本的逻辑运算符。

答案 2 :(得分:0)

您是否尝试将CREATEDON日期的所有记录设置为昨天及更早版本,并且应包含CREATEDON为NULL的列。如果是这种情况,则以下查询将起作用

SELECT COUNT(AL.PKAPPLICATIONID)
FROM APPLICATIONLOGO AS AL
    LEFT JOIN THIRDPARTYSESSIONKEY AS TSK
    ON AL.PKAPPLICATIONID = TSK.APPLICATIONSOURCEID
WHERE CAST(ISNULL(TSK.CREATEDON,GETDATE()-1) AS DATE) < CAST(GETDATE() AS DATE)