簡體   English   中英

SQL Case NOT NULL作為值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM