我试图返回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参数
答案 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具有相同数据类型的值。