我遇到一个问题,在 Postgres 14 中,修改类型后,对 UDT 的 NULL 检查不再有效。
我的复合 UDT 有两个属性。
create type A as (
foo text
);
create type B as (
bar text
);
create type AorB as (
a a,
b b
);
create table elements (
attr AorB
)
我只会设置这两个属性之一,并希望根据它是哪一个来访问它们。
insert into elements (attr)
values
(
(
ROW('aa')::A,
NULL
)::AorB
),
(
(
NULL,
ROW('bb')::B
)::AorB
);
select * from elements where (attr).a IS NOT NULL;
查询给了我正确答案
属性 |
---|
(“(aa)”,) |
但是,如果我修改这样的类型
alter type A add attribute bla text;
并重复相同的查询,我得到一个空结果。但是,如果删除 where 子句,我确实会看到所有数据。这是我的示例的游乐场:https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/10961
可能是什么问题以及如何解决?
select row('test', null) is not null; f
每比较运算符:
如果表达式是行值的,则当行表达式本身为空或所有行字段都为空时,IS NULL 为 true,而当行表达式本身为非空且所有行字段都为空时,IS NOT NULL 为 true是非空的。由于这种行为,IS NULL 和 IS NOT NULL 并不总是为行值表达式返回相反的结果;特别是,同时包含 null 和非 null 字段的行值表达式对于这两个测试都将返回 false。