我有一个json查询,可为我提供人和宠物联接表的json:
SELECT json_object(
'personId', p.id,
'pets', json_arrayagg(json_object(
'petId', pt.id,
'petName', pt.name
))
)
FROM person p LEFT JOIN pets pt
ON p.id = pt.person_id
GROUP BY p.id;
我的问题是一个人可以养0只或更多只宠物,而当一个人养0只宠物时,我得到1只空宠物的清单,在这种情况下,我想得到的是空清单。
这就是我得到的:
{
"personId": 1,
"pets": [
{
"petId": null,
"petName": ""
}
]
}
我需要:
{
"personId": 1,
"pets": []
}
有可能吗?
答案 0 :(得分:2)
问题是LEFT JOIN
仍从与之连接的表中返回列,只是将其值设置为NULL
。
您可以使用IF
来测试COUNT(pt.id)
,因为它不会计算空值。
SELECT json_object(
'personId', p.id,
'pets', IF(COUNT(pt.id) = 0, JSON_ARRAY(),
json_arrayagg(json_object(
'petId', pt.id,
'petName', pt.name
)
))
)
FROM person p LEFT JOIN pets pt
ON p.id = pt.person_id
GROUP BY p.id;
答案 1 :(得分:1)
另一种可能性是将聚合放入相关的子查询中,并在没有行的情况下使用coalesce()
将其替换为空数组。
SELECT json_object('personID', p.id,
'pets', coalesce((SELECT json_arrayagg(json_object('petId', t.id,
'petName', t.name))
FROM pets t
WHERE t.person_id = p.id),
json_array()))
FROM person p;