>假设我有一个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 != ''::MyEnum
,SELECT COUNT(*) FROM test WHERE my_enum = null::MyEnum
和SELECT 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]