[英]add condition to mysql json_arrayagg function
我有一个 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": []
}
那可能吗?
问题是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;
另一种可能性是将聚合放在相关子查询中,如果不存在行,则使用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;
添加另一个选项:
select IFNULL( /*expression of select ...JSON_ARRAYAGG(
JSON_OBJECT(....*/,JSON_ARRAY()) jarrayaggAlias
下面的清洁剂:
IFNULL( expression, ,JSON_ARRAY()) jarrayaggAlias
结果:
/* { jarrayaggAlias: [] }*/
如果您将alt_value 换成IFNULL以选择[]
,那么您的所有结果都将被字符串化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.