SQL Case NOT NULL作为值

时间:2014-09-04 00:44:42

标签: sql sql-server

我试图返回NOT NULL和NULL作为CASE语句的结果,但我找不到正确的方法来做到这一点

我在下面的内容不正确,并在NOT关键字

下划线
SELECT  ROW_NUMBER() OVER ( ORDER BY d.cnumber DESC) AS RowNum,
    d.cnumber,
    d.firstname,
    d.lastname,
    d.current_email,
    d.updated_email,
    d.optedin,
    d.activated             
FROM    
    Customer d 
WHERE (d.optedin = 
           CASE WHEN @query = 'UNSUBMITTED' OR @query = 'SUBMITTED' 
                    THEN d.optedin
                WHEN @query = 'OPTEDIN' 
                    THEN 1
                ELSE 0 END) AND
      (d.activated =
           CASE WHEN @query = 'OPTEDIN' OR @query = 'OPTEDOUT' 
                    THEN d.activated 
                WHEN @query = 'UNSUBMITTED' 
                    THEN NULL 
                ELSE NOT NULL END)

activated是一个可以为空的日期时间字段。 @query是varchar参数

3 个答案:

答案 0 :(得分:3)

case条款中使用where通常表明您走错了路。我相信你会发现你可以用更标准的逻辑解决这个问题:

WHERE (@query in ( 'UNSUBMITTED', 'SUBMITTED') 
         OR (@query = 'OPTEDIN' AND d.optedin = 1)
         OR d.optedin = 0)
       AND
      (@query in ('OPTEDIN', 'OPTEDOUT')
         OR (@query = 'UNSUBMITTED' AND d.activated IS NULL)
         OR  d.activated IS NOT NULL)

答案 1 :(得分:1)

我建议你修改d.activated的条件:

AND (@query = 'UNSUBMITTED' AND d.activated IS NULL OR @query <> 'UNSUBMITTED' AND d.activated IS NOT NULL)

请注意,您无需专门测试此情况:

CASE WHEN @query = 'OPTEDIN' OR @query = 'OPTEDOUT' 
                THEN d.activated 

在我提议

的情况下,OR d.activated IS NOT NULL将覆盖它

BTW,对于d.optedin,您可以使用类似的:

(@query = 'OPTEDIN' AND d.optedin = 1 OR @query <> 'OPTEDIN' AND d.optedin = 0)

答案 2 :(得分:0)

这:

ELSE NOT NULL 

太模糊了。 SQL Server不知道要返回什么。您必须指定与d.activated具有相同数据类型的值。