簡體   English   中英

帶有 where 條件的 SQL case 表達式

[英]SQL case expression with where condition

當我遇到錯誤時,如何以正確的格式排列 sql 的 case 表達式。 如果離開的字段日期不為空顯示,我正在嘗試創建一個條件,否則顯示為活動

SELECT DISTINCT  
PEO.PEOPLE_ID AS [PEOPLE_ID]  
,PEO.EMPLOYEECLOCKNO AS [EMPLOYEENUMBER]  
,ISNULL(CONVERT(VARCHAR(50),PEO.DATEOFJOIN,103),'') AS [DATEOFJOIN]  
--,ISNULL(PEO.DISPLAYSTATUS,'') AS [DISPLAYSTATUS]
,CASE 
    When ISNULL(PEO.STATUS,'' ) = 'A' 
    Then 'ACTIVE'
    ELSE 'LEFT' WHERE PEO.DATEOFLEAVING <> NULL
END as [STATUS]
  
INTO #BSP_EMPLOYEEDETAILS 

感謝您的幫助。

如果離開的字段日期不為空顯示,我正在嘗試創建一個條件,否則顯示為活動

CASE WHEN PEO.DATEOFLEAVING IS NULL THEN 'ACTIVE' ELSE 'LEFT' END

(我更喜歡讓布爾檢查產生積極的感覺而不是消極的感覺,但如果你想要它消極......)

CASE WHEN PEO.DATEOFLEAVING IS NOT NULL THEN 'LEFT' ELSE 'ACTIVE' END

請注意 HoneyBadger 的評論; 您應該只使用IS NULLIS NOT NULL將某些內容與 null 進行比較 - 帶有任何非 IS 運算符的 null 右操作數的結果為 null:

NULL IS NULL     --true
NULL IS NOT NULL --false
NULL = NULL      --null, which eventually will (probably) be processed as false
NULL <> NULL     --null, which eventually will (probably) be processed as false
NULL != NULL     --null, which eventually will (probably) be processed as false
NOT(NULL = NULL) --null, which eventually will (probably) be processed as false

我說“最終”是因為它很重要; 零點差。 如果你看最后一種情況, NULL=NULLNULL ,然后變成NOT(NULL) ,這也是NULL 如果NULL=NULL立即變為FALSENOT(NULL=NULL)將是NOT(FALSE)這將是TRUE null 在您執行的整個操作集中傳播,在最后彈出然后被解釋為 false 的事實可能是有利的,但始終是您應該注意的事情......

當然,如果接收它的東西是為了處理 NULL,比如COALESCE(NOT(NULL=NULL), 'it was null')那么它會收到一個 null(在這種情況下會輸出'it was null' )但是通常,當您在布爾上下文中使用它時,例如CASE WHEN NOT(mycolumn=NULL) THEN...WHERE NOT(mycolumn=NULL)它變成的 NULL 被 case when/where 接收並解釋為false

可能值得指出的是,SQLServer 在這些上下文中不支持布爾值,因此您不會使用這樣的合並,甚至NOT(NULL=NULL)示例,但如果您想嘗試發出聲音你的知識,MySQL 更寬容,並允許查詢如下:

select case when (NOT(x = NULL)) IS NULL THEN 't' ELSE 'f' end
from (select null as x)y

select case when (NOT(x = NULL)) IS UNKNOWN THEN 't' ELSE 'f' end
from (select null as x)y

SQLServer 期望您更快地確定空值,並且不會讓您處理它可以看到已變為空/未知的事情

關於 UNKNOWN 的腳注; 它通常被視為(在規范中,甚至)與布爾值 NULL 同義 - 它在真值表意義上被稱為三態布爾邏輯中的第三個值,但如果 DBs 支持 UNKNOWN 作為一個關鍵詞。 就我個人而言,我喜歡少記一件事情; 您可以通過應用這些簡單規則來了解 NULL 的行為並獲得邏輯一致的結果:IS NULL、IS NOT NULL、任何其他內容都變為 NULL,然后將其觸及的所有內容歸零

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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