如何在postgresql中创建和存储对象数组

时间:2013-11-20 12:03:47

标签: postgresql

在postgresql允许的数组类型或整数和text.But我需要创建objects数组。我可以这样做。

myarray text[];   //for text ['a','b','c']
myarray integer[];  //for integer[1,2,3]

我需要创建如下所示的数组

[{'dsad':1},{'sdsad':34.6},{'sdsad':23}] 

我不想使用JSON类型。使用数组类型我需要存储对象数组。

6 个答案:

答案 0 :(得分:5)

如果您正在运行Postgres 9.2+,则可以使用JSON类型。

例如,我们可以做

create table jsontest (id serial primary key, data json);
insert into jsontest (data) values ('[{"dsad":1},{"sdsad":34.6},{"sdsad":23}]');

使用

查询数据
select data->1 from jsontest;
{"sdsad":34.6}

答案 1 :(得分:2)

你说:

  

我不想使用JSON类型

不能使用普通数组,因为PostgreSQL数组必须是同类型的。你不能拥有文本和整数的二维数组。

如果您不想使用json,可以执行的操作是创建复合类型:

CREATE TYPE my_pair AS (blah text, blah2 integer);

SELECT ARRAY[ ROW('dasd',2), ROW('sdsad', 34.6), ROW('sdsad', 23) ]::my_pair[]

会发出:

                 array                  
----------------------------------------
 {"(dasd,2)","(sdsad,35)","(sdsad,23)"}
(1 row)

如果你不想那样,那么json可能是你最好的选择。或hstore

SELECT hstore(ARRAY['a','b','c'], ARRAY[1,2,3]::text[])

            hstore            
------------------------------
 "a"=>"1", "b"=>"2", "c"=>"3"
(1 row)

答案 2 :(得分:1)

您可以执行以下操作:

从mytable v中选择JSON_AGG(v);

但是您得到的东西看起来像这样:

[[“ 00000000-0000-0000-0000-000000000001”,“ 00000000-0000-0000-0000-000000000002”,“ 00000000-0000-0000-0000-000000000003”]

示例:

SELECT title, (select JSON_AGG(v.video_id) FROM videos v WHERE v.channel_id = c.channel_id) AS videos FROM channel AS c

答案 3 :(得分:0)

如果你的意思是json,那还不完全清楚:

# select '[{"dsad":1},{"sdsad":34.6},{"sdsad":23}]'::json;
                   json                   
------------------------------------------
 [{"dsad":1},{"sdsad":34.6},{"sdsad":23}]
(1 row)

或者json数组:

# select array['{"dsad":1}', '{"sdsad":34.6}', '{"sdsad":23}']::json[];
                        array                         
------------------------------------------------------
 {"{\"dsad\":1}","{\"sdsad\":34.6}","{\"sdsad\":23}"}
(1 row)

或者也许是hstore?如果是后者,它只适用于键值对,但您也可以使用一组hstore值。

答案 4 :(得分:0)

JSON是您的首选答案,但有关原因的更多信息。

您可以执行以下操作:

SELECT array_agg(v) 
  FROM mytable v;

但是你得到的东西看起来像这样:

{"(dsad,1)","(sdsad,34.6)","(""sdsad,var"",23)"}

然后由您知道如何解码(即列顺序)。这可以通过编程方式完成,但使用JSON更容易。

答案 5 :(得分:0)

这很棘手,但是对于对象中的每个属性(及其对应的标量类型)使用数组呢?如果在get / read中有一个数据模型层,则可以将数组“放回一起”到对象数组中,而在save方法中,您可以将对象分成同步数组。对于每个对象具有不同属性的示例,这可能会使情况变得复杂。 IDK如何存储未定义的属性,除非您希望null在语义上相同。