在PostgreSQL中插入hstore数组的语法

3

我是一名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"}' )

下面的答案也有帮助,但在这种情况下,一个字符串(而不是数组结构)与我的现有代码更兼容。
1个回答

5
我认为你会发现数组构造语法要容易得多:

The ARRAY constructor syntax can also be used:

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\""}');

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


谢谢!这很有帮助!最好在这里只有一个字符串,而不是一个“数组”结构。我有一些现有的代码需要一个字符串。 - xiaolong
看一下我的更新。虽然可能,但有点混乱。 - mu is too short
谢谢!我刚刚发现,我把内部的双引号扔掉了,然后它突然就可以工作了。仅仅通过查看您的更新,我相信它也会起作用! - xiaolong
hstore-quotes通常只需要在“看起来奇怪”的键上使用。但是,如果您正在以编程方式生成所有这些内容,您会希望加入所有引号、转义和其他必要的内容,以防万一。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接