如何从MariaDB多行TEXT列JSON数组中提取去重税类及税率值
MariaDB 10.4 提取JSON数组内税种及税率去重列表方案
核心实现逻辑
直接用MariaDB 10.4原生支持的JSON函数即可实现需求,无需额外开发存储过程或导出数据处理:
- 首先过滤掉
tax_components列中不是合法JSON格式的脏数据,避免解析报错 - 将每行存储的JSON格式税种数组拆分为独立的单条税种记录
- 提取每条记录的
tax_type和tax_percentage字段 - 对税种+税率的组合做去重,返回最终结果
推荐写法(性能最优)
用MariaDB 10.4内置的JSON_TABLE函数直接拆分JSON数组,写法简洁执行效率高:
SELECT DISTINCT tax_type, tax_percentage FROM orders JOIN JSON_TABLE( CAST(tax_components AS JSON), '$[*]' COLUMNS( tax_type VARCHAR(100) PATH '$.tax_type', tax_percentage DECIMAL(5,2) PATH '$.tax_percentage' ) ) AS parsed_tax_components WHERE JSON_VALID(tax_components);
兼容写法(适配极小部分不支持JSON_TABLE的10.4小版本)
如果你的实例无法识别JSON_TABLE函数,可以用内置序列表遍历数组下标的方式实现,注意调整序列上限覆盖你单条记录里JSON数组的最大长度即可,示例默认支持单条最多100个税种条目:
SELECT DISTINCT JSON_UNQUOTE(JSON_EXTRACT(CAST(tax_components AS JSON), CONCAT('$[', seq.n, '].tax_type'))) AS tax_type, JSON_UNQUOTE(JSON_EXTRACT(CAST(tax_components AS JSON), CONCAT('$[', seq.n, '].tax_percentage'))) AS tax_percentage FROM orders JOIN seq_0_to_100 AS seq WHERE JSON_VALID(tax_components) AND seq.n < JSON_LENGTH(CAST(tax_components AS JSON));
注意事项
- 上述写法会自动处理数组长度不一致、部分行缺失特定税种(比如你提到的Tobacco、Tobacco Tax)的情况,不需要额外加过滤条件
- 去重逻辑是对「税种名称+对应税率」的组合去重,如果同一个税种名称对应多个不同税率值,会分别返回不同的组合
- 返回结果集包含所有行里出现过的全部税种、对应税率的唯一组合,符合需求预期
内容的提问来源于stack exchange,提问作者Anand George
相关产品推荐
相关产品推荐

