postgresql 复合类型数组的正确语法

uqxowvwt  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(150)
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[...]**的情况下添加这个复合数组,正确的语法是什么?

cxfofazt

cxfofazt1#

到目前为止的建议还不是最佳的,有一个更简单的解决方案和实际适用的解释。
如果有疑问,只需让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);


请参阅 basic row type 的语法:

SELECT p::text AS p_row FROM pencil_count p;

  p_row
----------
 (red,1)
 (blue,2)


请参阅 array of rows 的语法:

SELECT ARRAY(SELECT p FROM pencil_count p)::text AS p_row_arr;

       p_row_arr
------------------------
 {"(red,1)","(blue,2)"}


您所需要做的就是将每个行文字用双引号括起来-这只需要在每个行类型中禁用 * 逗号 * 的特殊含义。
当没有额外的特殊字符时,额外的(转义的)双引号将是多余的噪音。
这一切都与转义字符串语法无关,自Postgres 9.1以来,转义字符串语法在默认情况下已被关闭。您必须通过前缀E显式声明转义字符串语法,就像E'string\n'一样。但没有充分的理由这样做。
fiddle
老小提琴
相关答案及更多解释:

  • 在PostgreSQL中插入带单引号的文本
  • 如何将自定义类型数组传递给Postgres函数
  • PL/pgSQL函数用于删除行数组
cpjpxq1n

cpjpxq1n2#

  • 我想添加这个复合数组,而不使用**ARRAY*

您可以使用:用途:

INSERT INTO pencils(pencils_) 
VALUES('{"(\"blue\",5)","(\"red\",2)"}');

字符串

db<>fiddle demo

Row type

请记住,您在SQL命令中写入的内容将首先被解释为字符串文字,然后被解释为复合。这将使您需要的反斜杠数量增加一倍(假设使用转义字符串语法)。

字符串文字处理器删除一级反斜杠。
在SQL命令中编写复合值时,ROW构造函数语法通常比composite-literal语法更容易使用。在ROW中,单个字段值的编写方式与它们不是复合成员时的编写方式相同。

相关问题