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

MySQL 7.4从TEXT列JSON数组提取指定税值并求和方法

MySQL解析JSON数组税项分类汇总实现方案

核心注意事项

  • 示例数据中部分tax_type值存在尾部空格(如'Tobacco '、'Exempt '),匹配时必须做去空格处理,否则会出现匹配遗漏
  • tax_components为TEXT类型,调用JSON函数前需要先转为JSON类型,避免格式解析报错
  • 存储的tax_amount为字符串格式,求和前需要转为数值类型,避免隐式转换导致计算错误

推荐写法(支持MySQL 8.0及以上,你提到的7.4版本大概率为版本标注笔误,该写法兼容MySQL 8.x全系列)

用JSON_TABLE函数直接把JSON数组拆为结构化行数据,再分组汇总,写法简洁可读性高:

SELECT
    TRIM(j.tax_type) AS tax_type,
    SUM(CAST(j.tax_amount AS DECIMAL(10,2))) AS total_tax_amount
FROM
    orders,
    JSON_TABLE(
        CAST(tax_components AS JSON),
        '$[*]' COLUMNS(
            tax_type VARCHAR(32) PATH '$.tax_type',
            tax_amount VARCHAR(32) PATH '$.tax_amount'
        )
    ) AS j
WHERE
    TRIM(j.tax_type) IN ('Vat 15', 'Tobacco', 'Exempt', 'Zero')
GROUP BY
    TRIM(j.tax_type);

兼容写法(支持MySQL 5.7版本)

如果环境是不支持JSON_TABLE的5.7版本,可以借助内置自增序列表遍历数组下标提取值:

SELECT
    TRIM(JSON_UNQUOTE(JSON_EXTRACT(CAST(tax_components AS JSON), CONCAT('$[', seq.id, '].tax_type')))) AS tax_type,
    SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(CAST(tax_components AS JSON), CONCAT('$[', seq.id, '].tax_amount'))) AS DECIMAL(10,2))) AS total_tax_amount
FROM
    orders o
INNER JOIN
    mysql.help_topic seq ON seq.id < JSON_LENGTH(CAST(o.tax_components AS JSON))
WHERE
    TRIM(JSON_UNQUOTE(JSON_EXTRACT(CAST(o.tax_components AS JSON), CONCAT('$[', seq.id, '].tax_type')))) IN ('Vat 15', 'Tobacco', 'Exempt', 'Zero')
GROUP BY
    tax_type;

扩展说明

如果需要保证4类税项即使没有任何数据(总额为0)也出现在结果中,可以提前构造4个税项的临时表,和上述汇总结果做左连接补全即可。


内容的提问来源于stack exchange,提问作者Anand George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:12:16