向mysql json_arrayagg函数添加条件

jqjz2hbq  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(428)

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

有可能吗?

nkhmeac6

nkhmeac61#

问题是 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;
3okqufwl

3okqufwl2#

另一种可能性是将聚合放在相关子查询中并使用 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;

相关问题