SQL中JSON_ARRAY()为何仅生成单元素数组而非预期多元素?
问题根源
JSON_ARRAY() 函数的参数是可变长度的多值列表,你传入的 Versions 是单个拼接完成的字符串值,MySQL不会自动将这个字符串按逗号拆分作为多个独立参数传入,因此只会生成包含该完整字符串的单元素数组。
解决方案
方案1:使用原生JSON聚合函数(推荐)
MySQL 5.7及以上版本提供JSON_ARRAYAGG()聚合函数,可直接将多行值聚合成合法JSON数组,无需手动处理字符串拼接、引号逻辑:
set session group_concat_max_len = 65000; CREATE TABLE IF NOT EXISTS someTable (VulnerabilityId VARCHAR(40), Versions JSON, Manager VARCHAR(100), PackageName VARCHAR(400), INDEX temp_vulnerabilityId_index(VulnerabilityId)) AS ( SELECT VulnerabilityId, JSON_ARRAYAGG(DISTINCT vulnerabilityExtendedData.Version) AS Versions, Manager, Name AS PackageName FROM ( SELECT * FROM myTable pv JOIN ( SELECT Id, Version, Name, 'Mvn' AS Manager FROM mvn ) pkgManagers ON pv.PackageId = pkgManagers.Id ) vulnerabilityExtendedData GROUP BY Id, Name, Manager ); -- 直接查询Versions字段即可得到预期的JSON数组 SELECT Versions FROM someTable; DROP TABLE IF EXISTS someTable;
方案2:转换已拼接的字符串为JSON数组
如果需要保留现有GROUP_CONCAT的逻辑,可将拼接好的字符串手动封装为合法JSON数组格式后再做类型转换:
SELECT CAST(CONCAT('[', Versions, ']') AS JSON) AS expected_array FROM someTable;
之前尝试无效的原因
你之前尝试的字段类型转换、调整引号逻辑都没有解决核心问题:JSON_ARRAY接收的是单个字符串参数,无论这个字符串的内容是什么,都会作为数组的唯一一个元素处理,和参数的类型、内容格式无关。
内容的提问来源于stack exchange,提问作者MC LinkTimeError
相关产品推荐
相关产品推荐

