如果子查询为空,则返回并清空json

时间:2016-02-18 20:43:14

标签: postgresql

HIHO,

如果其中一个子选择为空,我的查询出现了一个小问题。 小背景故事,这个查询可以返回有关用户的所有信息,因此它可以作为json发送到angular by rails。

如果每个人都有角色,它就能很好地工作,但如果这个人没有任何角色,那么查询的整个结果都是空的

这将是我的结果:

[{"id":1,"name":"person0","role":[{"id":1,"name":"role0","created_at":"2016-02-17T13:11:08.176Z","updated_at":"2016-02-17T13:11:08.176Z"},{"id":10,"name":"role9","created_at":"2016-02-17T13:11:08.185Z","updated_at":"2016-02-17T13:11:08.185Z"}]}]

我的查询如下:

Person.find_by_sql ["
SELECT
  p.id,
  p.name,
  json_agg(DISTINCT r) as role
FROM
  people as p, (
    SELECT
      r.id, r.name
    FROM
      people as p
    JOIN
      people_roles as pr
    ON
      pr.person_id = p.id
    JOIN
      roles as r
    ON
      r.id = pr.role_id
    WHERE
      p.id = ?
    ORDER BY
      p.id
  ) AS r
WHERE
  p.id = ?
GROUP BY
  p.id
    ", id, id]

我的目标是为角色获取一个空的json字符串,如果角色的子查询没有找到任何内容

[{"id":1,"name":"person0","role":[{}] ...

我试过这样的事情:

 COALESCE(json_agg(DISTINCT r), '[{}]'::json) as role,

如果有角色,这不会引发错误,但它也不起作用。 我希望描述充分。

我手边还碰巧有ER-model。为简单起见,我省略了一些部分(技能,语言,班次的子选择)

如果我找到id和name的默认值,如果找不到任何内容,我也会很高兴

[{"id":1,"name":"person0","role":[{"id":0,"name":"empty"..

所以我试图将coalesce移动到子查询的select中,但这根本没有意义。我理解它的方式coalesce只有在查询返回结果但只有1列为空时才有效,如果我没有得到任何结果则没有

1 个答案:

答案 0 :(得分:1)

请尝试LEFT JOIN而非常规JOIN