从内部联接简化SQL row_to_json

时间:2018-03-21 17:13:13

标签: sql json postgresql

我们有一个表格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)的需求?

3 个答案:

答案 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