Postgres:在CASE声明中否定条件

时间:2017-07-19 13:57:53

标签: sql postgresql 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

为什么否定不能按预期工作?这里使用的语法是正确的?

1 个答案:

答案 0 :(得分:1)

我猜这个原因是NULL值,所以像这样:

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

条件中的NULL值将返回NULLNOT NULL仍为NULL - 这被视为错误。