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列为空时才有效,如果我没有得到任何结果则没有
答案 0 :(得分:1)
请尝试LEFT JOIN
而非常规JOIN
。