向mysql json_arrayagg函数添加条件

时间:2018-12-28 00:32:33

标签: mysql

我有一个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": []
}

有可能吗?

2 个答案:

答案 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;