我有一个我想根据某些条件从结果集中过滤掉的行列表。目前,在我的查询中看起来像这样:
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 :(得分:1)
我猜这个原因是NULL
值,所以像这样:
WHEN NOT (col1 = 'x' OR col1 ~~ '%y%' AND col2 = 'z'...) OR col1 IS NULL THEN 'Reason 3'
条件中的NULL
值将返回NULL
。 NOT NULL
仍为NULL
- 这被视为错误。