2011-09-09 21 views
9

我具有複合型等如何制定包含數組的複合類型的數組字面量?

CREATE TYPE example AS (id integer, some_stuff integer[]); 

思想我可以使用這種類型的陣列作爲一個函數的自變量。唯一的問題是我無法找到一個方法來構建字面一個數組...如果我嘗試從PostgreSQL的獲得它:

WITH elements AS (
    SELECT (12, '{1,2}')::example AS e UNION 
    SELECT (3, '{3,1}')::example 
) 
SELECT array_agg(e) FROM elements; 

我得到如下:

{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 

但是看看:

SELECT E'{"(3,\"{3,1}\")","(12,\"{1,2}\")"}'::example[]; 

ERROR: malformed array literal: "{"(3,"{3,1}")","(12,"{1,2}")"}" 
LINE 1: select E'{"(3,\"{3,1}\")","(12,\"{1,2}\")"}'::example[] 

有沒有辦法做到這一點?

回答

11

使用try ARRAYROW構造函數:

Select array[row(3, array[3,1]), row(12, array[1,2])]::example[]; 
       array 
------------------------------------ 
{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 
(1 row) 

如果你想解決方案,而無需使用構造函數,然後使用下面的例子:

Select E'{"(3,\\"{3,1}\\")","(12,\\"{1,2}\\")"}'::example[]; 
       example 
------------------------------------ 
{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 
(1 row) 

正如你在這裏看到的主要問題是,你需要寫\\",因爲這實際上意味着\"(使用「escape」字符串語法),您將其看作第一個選擇的輸出。

+0

謝謝!唯一的問題是我必須在這裏使用文字,數組構造函數不是一個選項。幸運的是,這是一種罕見的情況:) – dezso

+0

@dezso:我明白了,查看我編輯的答案。 –

+0

太棒了!非常感謝。 – dezso

相關問題