[英]Postgres: negating conditions in CASE statement
我有一些要根据某些条件从结果集中过滤掉的行的列表。 当前,在我的查询中看起来像这样:
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
为什么取反不能按预期方式工作,此处使用的正确语法是什么?
我将猜测原因是NULL
值,所以像这样:
WHEN NOT (col1 = 'x' OR col1 ~~ '%y%' AND col2 = 'z'...) OR col1 IS NULL THEN 'Reason 3'
条件中的NULL
值将返回NULL
。 NOT NULL
仍然是NULL
并将其视为false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.