我有一个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只宠物时,我会得到一只空宠物的列表,在这种情况下我想得到的是空列表。
我得到的是:
{
"personId": 1,
"pets": [
{
"petId": null,
"petName": ""
}
]
}我需要:
{
"personId": 1,
"pets": []
}这有可能吗?
发布于 2018-12-28 00:50:33
问题是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;发布于 2018-12-28 01:00:12
另一种可能是将聚合放在关联子查询中,如果不存在行,则使用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;发布于 2022-05-17 10:33:07
增加另一个选项:
select IFNULL( /*expression of select ...JSON_ARRAYAGG(
JSON_OBJECT(....*/,JSON_ARRAY()) jarrayaggAlias清洁剂如下:
IFNULL( expression, ,JSON_ARRAY()) jarrayaggAlias结果:
/* { jarrayaggAlias: [] }*/如果将alt_value替换为IFNULL以选择[],则所有结果都将被字符串化。
https://stackoverflow.com/questions/53952383
复制相似问题