arrays - 复合类型数组的正确语法

标签 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)}');

这不起作用并给出错误:

Malformed array literal.

如果我想在不使用 ARRAY[...] 的情况下添加此复合数组,正确的语法是什么?

最佳答案

目前的建议并不是最佳的。有一个更简单的解决方案和实际适用的解释。
如有疑问,请 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)"}

您所需要做的就是用双引号将每一行文字括起来 - 这只是为了在每一行类型中禁用 逗号 的特殊含义所必需的。
如果没有额外的特殊字符,额外的(转义的)双引号将是多余的噪音。

这些都与 escape string syntax 没有任何关系,自 Postgres 9.1 以来,它已被默认关闭。关闭。您必须通过前缀 E 显式声明转义字符串语法,例如 E'string\n'。但没有充分的理由这样做。

db<> fiddle here
<子>旧sqlfiddle

更多解释的相关答案:

关于arrays - 复合类型数组的正确语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35955943/

相关文章:

Postgresql - 在特定时间和日期范围之间进行选择

sql - 如何在logstash中将数据库版本保存为sql_last_version变量

ruby-on-rails - 获取 Rails 中最后的相关记录

java - 从数据库中检索文件数据

postgresql - PostgreSQL 9.4 中 UUID 列索引的填充因子建议

javascript - 添加和删​​除 html 元素到 jquery 变量

python - Numpy:当对数组数组应用 bool 掩码时,记录原始数组中的项目的最有效方法

javascript - jQuery $.each push(this) 无法正常工作

php - 将元素从一个数组移动到另一个数组

sql - postgresql 9.4/9.5 - 选择...更新具有高读取和写入的大型数据集上的单个随机行