有一个json查询,可为我提供人和宠物联接表的json:
SELECT
json_object(
'personId', p.id,
'firstPetName', p.firstPetName,
'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;
我想添加一个条件,如果p.firstPetName
为空或空字符串以将第一只宠物的pt.petName
放入宠物列表,这可能吗?
示例:
如果这是结果:
{
"personId": 1,
"firstPetName": null // or ""
"pets": [
{
"petName": "walker"
},
{
"petName": "roxi"
}
]
}
我想得到:
{
"personId": 1,
"firstPetName": "walker"
"pets": [
{
"petName": "walker"
},
{
"petName": "roxi"
}
]
}
如果可以做类似pt[0].petName
的事情,那就太好了
答案 0 :(得分:1)
JSON_ARRAYAGG(col_or_expr) [over_clause]
将结果集聚合为单个JSON数组,其元素由行组成。 该数组中元素的顺序未定义。
因此,在您的用例中,未定义列表中宠物的顺序。您无法确定哪个宠物会首先出现在json_arrayagg
调用生成的json数组中。
以下查询给出的答案默认为带有最小名称的pet。然后使用COALESCE
函数为p.firstPetName
提供默认值。
SELECT
json_object(
'personId', p.id,
'firstPetName', COALESCE(p.firstPetName, MIN(pt.name))
'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;