2012-11-18 75 views
2

在我的應用程序中,我使用的PostgreSQL返回這樣的複合類型的值:PostgreSQL的陣列/複合輸出

select row('a','b','c','d'); 

該查詢將返回:

(A,B,C,d)

我正在使用更復雜的類型,其中包含其他複合類型的數組等。在我的數據庫層,我解析返回的值和「解壓縮」數組和其他組合。

問題?

select row(array[1,2,3,4]); 

select row('{1,2,3,4}'); 

給完全相同的輸出:

( 「{1,2,3,4}」)

我怎樣才能區分時這'{1,2,3,4}'意味着正常的字符串(可能由用戶提供),當它的意思是數組?

不應該在複合字段值中存在類似{}的轉義序列嗎?

P.S.我不能使用像select * from row[1,2,3]這樣的東西。

回答

2

確定列類型的最安全方法是查詢結果集元數據。

我不能告訴你,因爲你沒有指定你的框架/語言。一般來說,您需要擴展一些結果集類並解決此處的歧義。

+0

我知道查詢結果集的元數據的可能性,但你(和克雷格林格一起)幫助我從不同的角度看問題。謝謝你們倆。 – JoshuaBoshi

1

由於您使用匿名記錄,這將是具有挑戰性的。注意:

SELECT pg_typeof(row('{1,2,3,4}')), pg_typeof(row(array[1,2,3,4])); 

如果可能的話使用命名類型的CREATE TYPE,而不是匿名記錄(ROW()構造函數)。然後你可以檢查行類型。

CREATE TYPE r1 AS (col1 text); 
CREATE TYPE r2 AS (col1 integer[]); 

SELECT pg_typeof(row('{1,2,3,4}')::r1), pg_typeof(row(array[1,2,3,4])::r2); 

有可能是在協議級結果集元數據更詳細地,作爲的Ondrej表明,將提供的方法來做到這一點,而無需使用記錄類型。

+0

你的SQL爲兩者提供了完全相同的結果:'record'。是什麼賦予了? – mvp

+0

@mvp確切地說 - 你不能只使用'pg_typeof'來確定'record'的內部類型。我會修改我的答案,使其更清楚。 –