MySQL如何从JSON对象数组字段提取邮箱值并拼接为逗号分隔字符串
MySQL提取JSON数组内指定属性并拼接为逗号分隔字符串的实现方案
假设你的业务表名为your_table_name,存储JSON数组的字段为email_address_dump,可根据你的实际表名、字段名替换。
适用MySQL 8.0及以上版本(最优方案)
借助JSON_TABLE函数将JSON数组转为临时关系表,再通过GROUP_CONCAT拼接结果:
SELECT GROUP_CONCAT(t.email SEPARATOR ', ') AS email_list FROM your_table_name, JSON_TABLE( email_address_dump, '$[*]' COLUMNS ( email VARCHAR(255) PATH '$.value' ) ) AS t -- 可在此处添加原表的过滤条件,例如 WHERE id = 1001 GROUP BY your_table_name.id;
- 说明:
$[*]匹配JSON数组的所有元素,PATH '$.value'指定提取每个元素的value属性,SEPARATOR ', '控制最终拼接的分隔符和你要求的格式完全一致。
适用MySQL 5.7版本的兼容方案
如果暂时无法升级到8.0,可通过遍历数组下标的方式实现:
-- 先调大拼接长度限制,避免长列表被截断 SET SESSION group_concat_max_len = 102400; SELECT GROUP_CONCAT( JSON_UNQUOTE(JSON_EXTRACT(email_address_dump, CONCAT('$[', seq.idx, '].value'))) SEPARATOR ', ' ) AS email_list FROM your_table_name -- 数字序列的长度需要覆盖业务中JSON数组的最大长度,以下示例最多支持10个元素,可按需追加UNION JOIN ( SELECT 0 AS idx UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 ) AS seq WHERE seq.idx < JSON_LENGTH(email_address_dump) -- 可在此处添加原表的过滤条件 GROUP BY your_table_name.id;
- 说明:
JSON_LENGTH先拿到数组的元素个数,通过下标的方式逐个提取value属性,JSON_UNQUOTE用于去掉提取结果自带的双引号。
内容的提问来源于stack exchange,提问作者chewie
相关产品推荐
相关产品推荐

