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

MariaDB 10.2.14中JSON列数据提取优化方案问询

嘿,我来给你几个更优雅的解决方案,适配你用的MariaDB 10.2.14版本——这个版本已经支持不少实用的JSON函数了,完全不用再依赖容易出错的正则表达式硬抠数据!

方案1:用JSON_TABLE拆分JSON数组(最清晰健壮)

这个方法直接把JSON数组拆成结构化的行数据,然后通过关联筛选和匹配,逻辑一目了然,完全基于JSON结构处理,不怕字符串格式变化:

WITH JT1 AS (
    SELECT 1 AS ID , '[{"name":"x","score":2},{"name":"y", "score":8},{"name":"z","score":3}]' AS REPLY UNION ALL
    SELECT 2 AS ID , '[{"name":"x","score":5},{"name":"y", "score":4},{"name":"z","score":3}]' AS REPLY UNION ALL
    SELECT 3 AS ID , '[{"name":"x","score":2},{"name":"y", "score":2},{"name":"z","score":6}]' AS REPLY UNION ALL
    SELECT 4 AS ID , '[{"name":"x","score":5},{"name":"y", "score":8},{"name":"z","score":6}]' AS REPLY
)
SELECT 
    jt1.ID,
    y_entry->>'$.score' AS y_score
FROM JT1
-- 先筛选出x的score等于5的条目,同时记录它在数组中的位置(idx)
JOIN JSON_TABLE(
    JT1.REPLY,
    '$[*]' COLUMNS(
        name VARCHAR(10) PATH '$.name',
        score INT PATH '$.score',
        idx FOR ORDINALITY -- 生成数组元素的序号
    )
) x_entries ON x_entries.name = 'x' AND x_entries.score = 5
-- 通过相同的序号找到同个数组里的y条目
JOIN JSON_TABLE(
    JT1.REPLY,
    '$[*]' COLUMNS(
        name VARCHAR(10) PATH '$.name',
        score INT PATH '$.score',
        idx FOR ORDINALITY
    )
) y_entries ON y_entries.idx = x_entries.idx AND y_entries.name = 'y';

方案2:用JSON_CONTAINS+JSON_SEARCH快速定位(更简洁)

如果你的JSON数组里x和y的位置不固定,但只需要简单匹配提取,这个方案更紧凑:

WITH JT1 AS (
    SELECT 1 AS ID , '[{"name":"x","score":2},{"name":"y", "score":8},{"name":"z","score":3}]' AS REPLY UNION ALL
    SELECT 2 AS ID , '[{"name":"x","score":5},{"name":"y", "score":4},{"name":"z","score":3}]' AS REPLY UNION ALL
    SELECT 3 AS ID , '[{"name":"x","score":2},{"name":"y", "score":2},{"name":"z","score":6}]' AS REPLY UNION ALL
    SELECT 4 AS ID , '[{"name":"x","score":5},{"name":"y", "score":8},{"name":"z","score":6}]' AS REPLY
)
SELECT 
    ID,
    -- 提取y的score:先找到y的路径,再拼接成提取表达式
    JSON_UNQUOTE(JSON_EXTRACT(REPLY, CONCAT(JSON_SEARCH(REPLY, 'one', 'y'), '.score'))) AS y_score
FROM JT1
-- 直接判断数组中是否包含{"name":"x","score":5}这个元素
WHERE JSON_CONTAINS(REPLY, '{"name":"x","score":5}');

为什么这两个方案比正则好?

  • 健壮性:正则依赖字符串的格式细节(比如空格、引号位置),一旦JSON的格式化方式变化(比如多了个空格),正则就会失效;而JSON函数是解析JSON的结构,不受这些细节影响。
  • 可读性:谁看都能明白是在处理JSON里的x和y元素,不用费劲猜正则的匹配规则。
  • 可维护性:如果后续要提取z的score,或者修改匹配条件,调整JSON函数比改正则简单太多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:19