假设我有一个Postgres数据库,其中包含一个名为&#34的简单表格;测试':
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))
。在第一种情况下,我收到一个错误(" enum myenum的输入值无效:""")。在另外两个中,我得到"计数:0"。
似乎没有办法在Postgres的第3行中表达my_enum的值:(。如何只过滤那些设置了my_enum的行?
答案 0 :(得分:1)
null和空字符串之间存在差异。 NULL是缺少值。
使用此命令,这样就不会对空值和空字符串感到困惑。
\pset null [null]
答案 1 :(得分:1)
AlexM回答了我的问题。我正在寻找的代码是:
bundleForClass
我在测试SELECT COUNT(*) FROM test WHERE my_enum IS NOT NULL
时的错误是认为my_enum = null::MyEnum
是真的。 Postgres documentation说:
不要写expression = NULL,因为NULL不等于“NULL”。 (空值表示未知值,并且不知道两个未知值是否相等。)
我也因为
的行为而被绊倒(在测试null = null
中)
当任一输入为空时,普通比较运算符产生null(表示“未知”),而不是true或false。 (documentation)