让我们有以下几点PostgreSQL中:返回NULL,而不是从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
值和作为b
的值的空结构(NULL和NULL对),这是有点期待的。
现在,即使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;
它发出“NOTICE:t”。因此,似乎将NULL
分配给合成值实际上分配了具有所有属性NULL
的合成。考虑到NULL
值存储在表中时(UPDATE tbl SET b = NULL
结果b IS NOT DISTINCT FROM NULL
持有每一行;另一方面,UPDATE tbl SET b = (NULL,NULL)
是false
用于该测试),NULL
值可与(NULL,NULL)
区分。
您是否碰巧知道第一个选项的变体,该变体将防御“tbl”列的修改?我的意思是,当一个额外的列被添加到'tbl'时,函数不会中断 - 特别是当问题只出现在运行时,实际被调用的时候。 –
@OndřejBouda编辑 –
感谢您的编辑,代码似乎并不正确,尽管(在返回表的函数中'RETURN'应该没有参数),并且说到类型,它会返回一个表而不是单个行。然而,我真的明白了这一点。简单地将返回类型定义为一个新的组合类型't'并返回它,使用所提出的结构'return(1,nullif(s,(null,null):: struct));'解决问题。你能否修改编辑后的版本,以便我能接受答案? –