【问题标题】:Correct syntax for array of composite type复合类型数组的正确语法
【发布时间】:2016-06-27 15:01:57
【问题描述】:
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[...] 的情况下添加此复合数组,正确的语法是什么?

【问题讨论】:

    标签: arrays postgresql postgresql-9.4


    【解决方案1】:

    到目前为止的建议不是最佳的。有一个更简单的解决方案和一个实际适用的解释。
    如有疑问,只需让 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 起默认情况下已将其关闭关闭。您必须通过前缀E 显式声明转义字符串语法,例如E'string\n'。但是没有充分的理由这样做。

    db小提琴here
    sqlfiddle

    更多解释的相关答案:

    【讨论】:

    • 感谢您的回答..!
    【解决方案2】:

    我想在不使用 ARRAY

    的情况下添加这个复合数组

    你可以使用:

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

    db<>fiddle demo

    Row type

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

    字符串文字处理器删除一级反斜杠。

    在 SQL 命令中编写复合值时,ROW 构造函数语法通常比复合文字语法更容易使用。在 ROW 中,各个字段值的写入方式与它们不是组合成员时的写入方式相同。

    【讨论】:

    • 我需要通过驱动程序传递 func 参数,因此我必须对复合类型数组使用文字。无法弄清楚如何用逗号格式化文本,并且在黑暗中拍摄了几个小时。终于找到这个帖子了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多