You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 00:54:00