gpt4 book ai didi

postgresql - 从 PostgreSQL 函数返回 NULL 而不是复合值

转载 作者:行者123 更新时间:2023-11-29 11:35:56 27 4
gpt4 key购买 nike

让我们在 PostgreSQL 中拥有以下内容:

CREATE TYPE struct AS (x INT, y INT);
CREATE TABLE tbl (a INT, b struct);

CREATE FUNCTION find_tbl_entry(clear BOOL) RETURNS tbl AS $$
DECLARE k tbl;
BEGIN
IF clear THEN
k.b := NULL;
END IF;

RETURN k;
END;
$$ LANGUAGE plpgsql;

也就是说,我们有一个返回复合类型 tbl 值的函数,它又具有复合类型 struct 的属性 b > 作为其属性之一。 (原来的问题更有趣——一个翻译函数返回一行,其中一些属性被相应地翻译;不过,问题归结为所提供的代码。)

SELECT find_tbl_entry(FALSE) 结果为 (,(,)),即 NULL 作为 a 的值和空结构(NULL 和 NULL 对)作为 b 的值,这有点符合预期。

现在,即使 SELECT find_tbl_entry(TRUE) 也会产生 (,(,)),也就是说,即使 b 属性是显式的设置为NULL,结果不是NULL,但它仍然是空结构。

如何让函数 find_tbl_entry 返回 b 属性中的 NULL


编辑:事实证明,奇怪的是赋值 k.b := NULL。扩展功能时:

k.b := NULL;
RAISE NOTICE '%', k.b IS DISTINCT FROM NULL;

它发出“注意:t”。因此,似乎将 NULL 分配给复合值实际上是在分配具有所有属性 NULL 的复合值。这很奇怪,考虑到 NULL 值在存储在表中时可与 (NULL,NULL) 区分开来 (UPDATE tbl SET b = NULL 导致每一行的 b IS NOT DISTINCT FROM NULL 保持不变;另一方面,UPDATE tbl SET b = (NULL,NULL)false 用于该测试)。

最佳答案

有必要:

直接返回null,而不是返回赋值的变量:

create or replace function find_tbl_entry()
returns tbl as $$
declare s struct;
begin
s := null;
return (1, nullif(s, (null,null)::struct));
end;
$$ language plpgsql;

select a, b, b is null from find_tbl_entry();
a | b | ?column?
---+---+----------
1 | | t

或者在函数使用时比较:

select coalesce(nullif((find_tbl_entry()).b, (null,null)::struct), (1,2)::struct);
coalesce
----------
(1,2)

关于postgresql - 从 PostgreSQL 函数返回 NULL 而不是复合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42631039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com