【问题标题】:How do I identify rows with empty / undefined enum values in postgres?如何在 postgres 中识别具有空/未定义枚举值的行?
【发布时间】:2017-03-28 04:48:29
【问题描述】:

假设我有一个 Postgres 数据库,其中包含一个名为“test”的简单表:

id
--
1
2
3

还有一个枚举定义:

CREATE TYPE MyEnum AS ENUM ('UNKNOWN', 'TEST')

现在,我可以在我的表中添加一个枚举值列:

ALTER TABLE test ADD COLUMN my_enum MyEnum;
UPDATE test SET my_enum = 'UNKNOWN'::MyEnum WHERE id = 1;
UPDATE test SET my_enum = 'TEST'::MyEnum WHERE id = 2;

结果是:

> SELECT * FROM test;
id  | my_enum
----|--------
1   | UNKNOWN
2   | TEST
3   |

my_enum 在第 3 行有什么值?有没有办法表达?我试过SELECT COUNT(*) FROM test WHERE my_enum != ''::MyEnumSELECT COUNT(*) FROM test WHERE my_enum = null::MyEnumSELECT COUNT(*) FROM test WHERE my_enum != ALL(enum_range(null::MyEnum))。在第一种情况下,我收到一个错误(“枚举 myenum 的输入值无效:”“”)。在另外两个中,我只得到“count: 0”。

似乎没有办法在 Postgres 的第 3 行中表达 my_enum 的值 :(。我怎样才能只过滤那些设置了 my_enum 的行?

【问题讨论】:

  • SELECT COUNT(*) FROM test WHERE my_enum IS NOT NULL
  • 我认为 Alex 的意思是 SELECT * FROM test WHERE my_enum IS NULL

标签: postgresql enums null


【解决方案1】:

AlexM 回答了我的问题。我正在寻找的代码是:

SELECT COUNT(*) FROM test WHERE my_enum IS NOT NULL

我在测试my_enum = null::MyEnum 时的错误是认为null = null 是真的。 Postgres documentation 说:

不要写表达式 = NULL,因为 NULL 不“等于”NULL。 (null值代表未知值,不知道两个未知值是否相等。)

我也被以下行为绊倒(在测试my_enum != ALL(enum_range(null::MyEnum))

当任一输入为空时,普通比较运算符产生空值(表示“未知”),而不是真或假。 (documentation)

【讨论】:

  • 我需要的是WHERE my_field_a IS DISTINCT FROM my_field_b(当两者之一可能是NULL
【解决方案2】:

null 和空字符串是有区别的。 NULL 是没有值。

使用此命令,您不会与 null 和空字符串混淆。

\pset null [null]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多