2017-07-19 73 views
0

我有一列我想根據某些條件從結果集中篩選出的行。目前,它看起來像這樣在我的查詢:Postgres:否定CASE語句中的條件

WHERE col1 = 'x' OR col1 ~~ '%y%' AND col2 = 'z' ... 

現在我要爲大家介紹的是文檔的某些行被過濾掉的原因一個新列:

SELECT ... 
    , CASE WHEN condition1 THEN 'Exclusion Reason 1' 
     WHEN condition2 THEN 'Exclusion Reason 2' 
     ... 
     ELSE '' 
    END AS exclusion_reason 

的問題:它似乎沒有在上班的路上我使用的否定:

SELECT ... 
    , CASE WHEN condition1 THEN 'Reason 1' 
     WHEN condition2 THEN 'Reason 2' 
     WHEN NOT (col1 = 'x' OR col1 ~~ '%y%' AND col2 = 'z'...) THEN 'Reason 3' 
     ELSE '' 
    END AS exclusion_reason 

它不Reason 3返回任何行,但它應該。離開了NOT標誌着中行的子集:

SELECT ... 
    , CASE WHEN condition1 THEN 'Reason 1' 
     WHEN condition2 THEN 'Reason 2' 
     WHEN (col1 = 'x' OR col1 ~~ '%y%' AND col2 = 'z'...) THEN 'Not Reason 3' 
     ELSE '' 
    END AS exclusion_reason 

爲什麼如預期的,什麼是在這裏使用正確的語法並不否定不行?

+0

僅供[文檔](https://www.postgresql.org/docs/9.1/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL)明確表示的評論:*「評估順序的子表達式沒有被定義,特別是,操作符或函數的輸入不一定是從左到右或以任何其他固定順序進行評估。「*,那麼用'()'圍繞就更安全了。比賽。在給出的例子中,((col1 ='x'或col1 ~~'%y%')AND col2 ...)等 –

回答

1

我要去猜測,原因是NULL值,所以是這樣的:

WHEN NOT (col1 = 'x' OR col1 ~~ '%y%' AND col2 = 'z'...) OR col1 IS NULL THEN 'Reason 3' 

在條件爲A NULL值將返回NULLNOT NULL仍然是NULL - 這被視爲虛假。