在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类型。使用数组类型我需要存储对象数组。
答案 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在语义上相同。