在PostgreSQL中插入hstore数组的语法

时间:2014-10-28 02:48:20

标签: sql arrays postgresql hstore

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' }`)

任何修复?谢谢!

== EDIT ==


刚想通了。

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

下面的答案也有帮助,但在这种特殊情况下,字符串(而不是数组结构)可以更好地利用现有代码。

1 个答案:

答案 0 :(得分:5)

我认为您使用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\""}');

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