如何制定包含数组的复合类型的数组文字?

时间:2011-09-09 14:51:17

标签: arrays postgresql composite

我有像

这样的复合类型
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[]

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:11)

尝试使用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)

正如您所看到的,主要问题是您需要编写\\",因为这实际上意味着\"(使用“转义”字符串语法),您将其视为第一个选择的输出。