[英]SQL Case NOT NULL as value
我正在嘗試通過CASE語句返回NOT NULL和NULL,但找不到正確的方法
我下面的內容不正確,並強調了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參數
通常在where
子句中使用case
表示您走錯了路。 我相信您會發現您可以使用更多標准邏輯來解決此問題:
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)
我建議您將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
,所以在我提出的條件下, OR d.activated IS NOT NULL
順便說一句,對於d.optedin,您可以使用類似的命令:
(@query = 'OPTEDIN' AND d.optedin = 1 OR @query <> 'OPTEDIN' AND d.optedin = 0)
這個:
ELSE NOT NULL
太模糊了。 SQL Server不知道返回什么。 您必須指定與d.activated相同的數據類型的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.