low*_*ion 5 arrays postgresql postgresql-9.4
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)}');
Run Code Online (Sandbox Code Playgroud)
这不起作用并给出错误:
格式错误的数组文字。
如果我想在不使用的情况下添加这个复合数组,正确的语法是ARRAY[...]什么?
Erw*_*ter 10
到目前为止的建议不是最佳的。有一个更简单的解决方案和一个实际适用的解释。
如有疑问,请让 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[]
);
Run Code Online (Sandbox Code Playgroud)
插入 2 个基本行:
INSERT INTO pencil_count VALUES ('red', 1), ('blue', 2);
Run Code Online (Sandbox Code Playgroud)
请参阅基本行类型的语法:
SELECT p::text AS p_row FROM pencil_count p;
p_row
----------
(red,1)
(blue,2)
Run Code Online (Sandbox Code Playgroud)
查看行数组的语法:
SELECT ARRAY(SELECT p FROM pencil_count p)::text AS p_row_arr;
p_row_arr
------------------------
{"(red,1)","(blue,2)"}
Run Code Online (Sandbox Code Playgroud)
您所需要的只是用双引号将每一行文字括起来——这只是在每个行类型中禁用逗号的特殊含义所必需的。
额外的(转义)双引号将是多余的噪音,而没有额外的特殊字符。
这些都与转义字符串语法没有任何关系,自 Postgres 9.1 以来,它已默认关闭。您必须通过前缀显式声明转义字符串语法E,例如E'string\n'. 但没有充分的理由这样做。
相关答案有更多解释:
我想添加这个复合数组而不使用ARRAY
你可以使用:
INSERT INTO pencils(pencils_)
VALUES('{"(\"blue\",5)","(\"red\",2)"}');
Run Code Online (Sandbox Code Playgroud)
请记住,您在 SQL 命令中编写的内容将首先被解释为字符串文字,然后被解释为组合。这会使您需要的反斜杠数量加倍(假设使用转义字符串语法)。
字符串文字处理器删除一层反斜杠。
在 SQL 命令中编写复合值时,ROW 构造函数语法通常比复合文字语法更容易使用。在 ROW 中,各个字段值的写入方式与非组合成员时的写入方式相同。
| 归档时间: |
|
| 查看次数: |
5348 次 |
| 最近记录: |