Как сформулировать литерал массива составного типа, содержащий массивы? - PullRequest
9 голосов
/ 09 сентября 2011

У меня есть составной тип, как

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 Ответ

11 голосов
/ 09 сентября 2011

Попробуйте использовать ARRAY и ROW конструкторы:

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»), который вы видели в качестве результата вашего первого выбора.

...