在 UDT 上添加属性后进行 PostgreSQL NULL 检查

问题描述 投票:0回答:1

我遇到一个问题,在 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

可能是什么问题以及如何解决?

sql postgresql user-defined-types sql-null
1个回答
0
投票

select row('test', null) is not null; f

比较运算符

如果表达式是行值的,则当行表达式本身为空或所有行字段都为空时,IS NULL 为 true,而当行表达式本身为非空且所有行字段都为空时,IS NOT NULL 为 true是非空的。由于这种行为,IS NULL 和 IS NOT NULL 并不总是为行值表达式返回相反的结果;特别是,同时包含 null 和非 null 字段的行值表达式对于这两个测试都将返回 false。

© www.soinside.com 2019 - 2024. All rights reserved.