从here和here中,我发现如果我想将一组相关的行聚合成一个对象数组,我必须使用以下语法:
(select to_json(C) from ( /* subquery */ ) C)
如果我有三张table:user
、creature
及其连接表user_creature
:
我想检索每个用户,以及属于这个用户的每个生物,我必须这样做:
select to_json(T)
from (
select "user".id as user_id,
(select to_json(C) -- !!! There it is
from (
select name, height
from creature
inner join "user_creature" uc on creature.id = "uc".creature_id
inner join "user" u on "uc".user_id = u.id
where u.id = user_id
) C) as "creatures" -- !!! There it is
from "user"
) T;
此查询成功检索用户及其相关生物的列表:
有没有一种方法可以从查询中删除select
和from
关键字,这样我就可以像这样写我的查询:
select to_json(T)
from (
select "user".id as user_id,
to_json( -- !!! Calling to_json directly on select statement
select name, height
from creature
inner join "user_creature" uc on creature.id = "uc".creature_id
inner join "user" u on "uc".user_id = u.id
where u.id = user_id
) as "creatures"
from "user"
) T;
2条答案
按热度按时间jum4pzuy1#
可以使用子查询作为
to_json
的参数,但不实用:to_json( (SELECT … FROM …) )
(See a demo here)。
如果只想写一个
SELECT
查询,则使用json_build_object
:如果你想检索多行,可以使用
SELECT json_agg(json_build_object(…)) FROM …
或ARRAY(SELECT json_build_object(…) FROM …)
:qacovj5a2#
对我来说是有效的
row_to_json
-将所有列值打包为一个(按行)json_agg
-将所有行打包到一个单元格中