【问题标题】:syntax for inserting hstore arrays in PostgreSQL在 PostgreSQL 中插入 hstore 数组的语法
【发布时间】:2014-10-28 13:39:23
【问题描述】:

Postgres 的新手,只是想知道语法会是什么样子。例如,我有下表:

CREATE TABLE test
(
  field1 hstore[],
  field2 text[],
  field3 hstore
)
...

对于插入数组,语法类似

INSERT INTO test (field2)  VALUES (' {"abc","def"} ');

对于插入 hstore,语法类似于

INSERT INTO test (field3) VALUES (' "a"=>1.0, "b"=>2.4 ');

但是,对于“field1”上的插入,我该怎么办?像下面这样的东西给了我错误:

INSERT INTO test (field1) 
VALUES (`{'"a"=>1.0, "b"=>2.0', '"a"=>3.0, "b"=>4.0' }`)

任何修复?谢谢!

==编辑==


刚刚想通了。

INSERT INTO test (field1) 
VALUES ('{"a=>1.0, b=>2.0", "a=>3.0, b=>4.0"}' )

下面的答案也有帮助,但在这种特殊情况下,字符串(而不是数组结构)更适合我现有的代码。

【问题讨论】:

    标签: sql arrays postgresql hstore


    【解决方案1】:

    我认为您使用array constructor syntax 会更轻松:

    也可以使用ARRAY构造函数语法:

    INSERT INTO sal_emp
        VALUES ('Bill',
        ARRAY[10000, 10000, 10000, 10000],
        ARRAY[['meeting', 'lunch'], ['training', 'presentation']]);
    

    类似这样的:

    INSERT INTO test (field1) 
    VALUES (array['"a"=>1.0, "b"=>2.0'::hstore, '"a"=>3.0, "b"=>4.0'::hstore]);
    

    您只需要对数组中的第一个元素进行::hstore 强制转换,但将它们全部强制转换并没有什么坏处。

    我倾向于专门使用数组构造函数语法,因为所有的字符串解析和引用都让我头疼。

    如果你不能使用数组构造器语法,你可以问PostgreSQL自己怎么做:

    => select array['"a"=>1.0, "b"=>2.0'::hstore, '"a"=>3.0, "b"=>4.0'::hstore];
                                    array                                
    ---------------------------------------------------------------------
     {"\"a\"=>\"1.0\", \"b\"=>\"2.0\"","\"a\"=>\"3.0\", \"b\"=>\"4.0\""}
    

    请注意,各个 hstore 用双引号括起来:

    "\"a\"=>\"1.0\", \"b\"=>\"2.0\""
    

    并且他们使用反斜杠转义的双引号作为其内部结构。这给了我们:

    INSERT INTO test (field1) 
    VALUES ('{"\"a\"=>\"1.0\", \"b\"=>\"2.0\"","\"a\"=>\"3.0\", \"b\"=>\"4.0\""}');
    

    我仍然会尝试使用数组构造函数语法,所有那些嵌套的引号和转义都很讨厌。

    【讨论】:

    • 谢谢!这有帮助!这里最好只有一个字符串而不是“数组”结构。我有一些需要字符串的现有代码。
    • 看看我的更新。这是可能的,但它有点可怕。
    • ^ 谢谢!刚刚想通了,我扔掉了内部的双引号,它突然起作用了。仅通过查看您的更新,我相信它也会起作用!
    • hstore-quotes 通常只需要“奇怪的”键。但是,如果你以编程方式生成所有这些东西,你会想要加入所有的引号和转义等等,以防万一。
    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多