我们有一个表格Things
,其中的实例属于Projects
表格thing.project_id
。
当查询Things
的实例时,我们将返回父Project
记录的json表示作为该实例的值。
目前它看起来像:
SELECT t.id,
(
SELECT row_to_json(a.*)
FROM (
SELECT p.id, p.name
) AS a
) AS project
FROM "Things" t
INNER JOIN "Projects" p ON p.id = t.project_id
WHERE t.id = ?
这很好用,但似乎可以简化。
有没有办法在保持清晰度的同时摆脱对中间变量(本例中为a
)的需求?
答案 0 :(得分:3)
不确定你想要什么,但是怎么样:
SELECT t.id, to_jsonb(p) as project
FROM "Things" t
JOIN "Projects" p ON p.id = t.project_id
WHERE t.id = ?
要排除project
表格中的列,您可以将-
运算符与jsonb
一起使用:
SELECT t.id, to_jsonb(p) - 'id' as project
FROM "Things" t
JOIN "Projects" p ON p.id = t.project_id
WHERE t.id = ?
您可以通过以下方式删除多个列:
SELECT t.id, to_jsonb(p) - array['id', 'some_column'] as project
FROM "Things" t
JOIN "Projects" p ON p.id = t.project_id
WHERE t.id = ?
答案 1 :(得分:1)
如何使用json_build_object
功能:
SELECT t.id, json_build_object('id', p.id, 'name', p.name) AS project
FROM "Things" t
INNER JOIN "Projects" p ON p.id = t.project_id
WHERE t.id = ?
答案 2 :(得分:1)
如果要在所选列上使用row_to_json()
,则子查询是必需的,但是将子查询用作派生表(即{{1}中)更自然且更具可读性(IMO) }子句:
FROM