[英]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.