我有像
这样的复合类型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[]
有办法做到这一点吗?
答案 0 :(得分:11)
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)
正如您所看到的,主要问题是您需要编写\\"
,因为这实际上意味着\"
(使用“转义”字符串语法),您将其视为第一个选择的输出。