如何识别 postgres 中具有空/未定义枚举值的行



>假设我有一个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 的输入值无效:""(。在另外两个中,我只得到"计数:0"。

似乎没有办法在 Postgres :( 的第 3 行中表示my_enum的值。如何仅过滤已设置my_enum行?

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

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

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

不要写表达式 = NULL,因为 NULL 不"等于"NULL。(null 值表示未知值,并且不知道两个未知值是否相等。

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

普通比较运算符在任一输入为 null 时产生 null(表示"未知"(,而不是真或假。(文档(

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

使用此命令,以免与 null 和空字符串混淆。

pset null [null]

相关内容

  • 没有找到相关文章

最新更新