首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向mysql json_arrayagg函数添加条件

向mysql json_arrayagg函数添加条件
EN

Stack Overflow用户
提问于 2018-12-28 00:32:32
回答 3查看 7K关注 0票数 11

我有一个json查询,它提供了一个由人和宠物组成的连接表的json:

代码语言:javascript
复制
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只宠物时,我会得到一只空宠物的列表,在这种情况下我想得到的是空列表。

我得到的是:

代码语言:javascript
复制
{
  "personId": 1,
  "pets": [
    {
      "petId": null,
      "petName": ""
    }
  ]
}

我需要:

代码语言:javascript
复制
{
  "personId": 1,
  "pets": []
}

这有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-28 00:50:33

问题是LEFT JOIN仍然从您要加入的表中返回列,它只是将它们的值设置为NULL

您可以使用IF测试COUNT(pt.id),因为这不会计算空值。

代码语言:javascript
复制
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;
票数 15
EN

Stack Overflow用户

发布于 2018-12-28 01:00:12

另一种可能是将聚合放在关联子查询中,如果不存在行,则使用coalesce()替换为空数组。

代码语言:javascript
复制
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;
票数 7
EN

Stack Overflow用户

发布于 2022-05-17 10:33:07

增加另一个选项:

代码语言:javascript
复制
select IFNULL( /*expression of select ...JSON_ARRAYAGG(
                                    JSON_OBJECT(....*/,JSON_ARRAY()) jarrayaggAlias

清洁剂如下:

代码语言:javascript
复制
IFNULL( expression, ,JSON_ARRAY()) jarrayaggAlias

结果:

代码语言:javascript
复制
/* { jarrayaggAlias: []  }*/

如果将alt_value替换为IFNULL以选择[],则所有结果都将被字符串化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53952383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档