首页 > 解决方案 > 如何使用 JSON_TABLE 组合“NESTED PATH”值以获取嵌套的 JSON 数组?

问题描述

我有一个 Json 数组,如下所示

[{"keyId": "aded5b0107bb5a936604bcb6f", "keyNames": ["abc1, abc2"], "keyDesc": "test"}]

我正在使用 JSON_TABLE 来获取所有值,并且我编写了以下查询:

SELECT j.keyId, j.keyNames, j.keyDesc
FROM asknow a, JSON_TABLE(value, '$[*]' 
    COLUMNS(
      keyId TEXT PATH '$.keyId',
      NESTED PATH '$.keyNames[*]' COLUMNS (keyNames TEXT PATH '$'),
      keyDesc TEXT PATH '$.keyDesc')
    ) AS j;

我得到以下输出:

keyId                        keyNames   keyDesc
aded5b0107bb5a936604bcb6f    abc1       test
aded5b0107bb5a936604bcb6f    abc2       test

如何修改查询以便将值组合成单个字符串"abc1, abc2"

期望的输出:

keyId                        keyNames   keyDesc
aded5b0107bb5a936604bcb6f    abc1, abc2       test

标签: mysqlarraysjsonsql-updatemysql-json

解决方案


您可以将json_table列与group_concat() 组合以将从内部数组中提取的多行分组。

SELECT j.keyId, group_concat(distinct j.keyNames) as keyNames, j.keyDesc
FROM JSON_TABLE(@temp, '$[*]' 
    COLUMNS(
      keyId TEXT PATH '$.keyId',
      NESTED PATH '$.keyNames[*]' COLUMNS (keyNames TEXT PATH '$'),
      keyDesc TEXT PATH '$.keyDesc')
    ) AS j
group by j.keyId, j.keyDesc;

我不确定您为什么asknow a在查询中使用了表,所以暂时忽略它。我用过 MySQL 8.0。

db<>小提琴


推荐阅读