讓我們有以下幾點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));'解決問題。你能否修改編輯後的版本,以便我能接受答案? –