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

dez*_*zso 9 arrays postgresql composite

我有一个复合类型

CREATE TYPE example AS (id integer, some_stuff integer[]);
Run Code Online (Sandbox Code Playgroud)

以为我可以使用这种类型的数组作为函数的参数.唯一的问题是我找不到为此构建数组文字的方法...如果我尝试从PostgreSQL获取它:

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

我得到以下内容:

{"(3,\"{3,1}\")","(12,\"{1,2}\")"}
Run Code Online (Sandbox Code Playgroud)

但看:

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[]
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Grz*_*ski 11

尝试使用ARRAYROW构造函数:

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

如果您需要不使用构造函数的解决方案,请使用以下示例:

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

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