CREATE TYPE pencil_count AS(
pencil_color varchar(30),
count integer
);
CREATE TABLE pencils(id serial, pencils_ pencil_count[]);
INSERT INTO pencils(pencils_) VALUES('{("blue",5),("red",2)}');
这不起作用并给出错误:
格式错误的数组文字。
如果我想在不使用 ARRAY[...]
的情况下添加此复合数组,那么正确的语法是什么?
答案 0 :(得分:4)
到目前为止的建议并非最佳。有一个更简单的解决方案和实际适用的解释 如有疑问,只要求Postgres向您展示:
CREATE TEMP TABLE pencil_count ( -- table also registers row type
pencil_color varchar(30)
, count integer
);
CREATE TEMP TABLE pencils (
id serial
, pencils_ pencil_count[]
);
插入2个基本行:
INSERT INTO pencil_count VALUES ('red', 1), ('blue', 2);
请参阅基本行类型的语法:
SELECT p::text AS p_row FROM pencil_count p;
p_row
----------
(red,1)
(blue,2)
请参阅行数组的语法:
SELECT ARRAY(SELECT p FROM pencil_count p)::text AS p_row_arr;
p_row_arr
------------------------
{"(red,1)","(blue,2)"}
您只需将每个行文字用双引号括起来 - 这只是在每个行类型中禁用逗号的特殊含义所必需的。
附加(转义)双引号将是多余的噪音。
这与转义字符串语法无关,默认情况下,自Postgres 9.1以来,它已默认 off 。您必须通过前置E
来明确声明转义字符串语法,例如E'string\n'
。但没有充分的理由这样做。
相关答案以及更多解释:
答案 1 :(得分:1)
我想在不使用 ARRAY
的情况下添加此复合数组
您可以使用:
INSERT INTO pencils(pencils_)
VALUES('{"(\"blue\",5)","(\"red\",2)"}');
的 SqlFiddleDemo
强>
请记住,您在SQL命令中编写的内容将首先解释为字符串文字,然后解释为复合。这会使您需要的反斜杠数量增加一倍(假设使用了转义字符串语法)。
string-literal处理器删除一级反斜杠。
在SQL命令中编写复合值时,ROW构造函数语法通常比复合文字语法更容易使用。在ROW中,单个字段值的写入方式与非复合成员时的写入方式相同。