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

时间:2017-03-28 04:48:30

标签: postgresql enums null

假设我有一个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 != ''::MyEnumSELECT 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的行?

2 个答案:

答案 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