繁体   English   中英

Postgres:否定CASE语句中的条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM