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

如何在WHILE/REPEAT循环中用->>替代JSON_EXTRACT并替换索引0为计数器i

MySQL中用->>语法结合循环计数器遍历JSON数组的正确写法

需求:在WHILE循环中用->>语法替代JSON_UNQUOTE(JSON_EXTRACT),同时用循环计数器i替换固定索引0,遍历JSON数组_payments。

初始写法

两种原始实现方式:

-- 写法1:使用JSON_UNQUOTE+JSON_EXTRACT结合动态路径
WHILE i < JSON_LENGTH(_payments) DO                             
    SELECT JSON_UNQUOTE(JSON_EXTRACT(_payments, CONCAT('$[', i, '].name')));
    SELECT i+1 INTO i;
END WHILE;

-- 写法2:使用->>语法但固定索引0
WHILE i < JSON_LENGTH(_payments) DO
    SELECT _payments->>'$[0].name';
    SELECT i+1 INTO i;
END WHILE;

错误尝试的写法

以下两种写法无法正常工作:

-- 错误写法1:路径多了额外引号
WHILE i < JSON_LENGTH(_payments) DO
    SELECT _payments->>concat('"$[', i, '].name"');
    SELECT i+1 INTO i;
END WHILE;

-- 错误写法2:部分MySQL版本不支持->>直接跟表达式
WHILE i < JSON_LENGTH(_payments) DO
    SELECT _payments->>concat('$[', i, '].name');
    SELECT i+1 INTO i;
END WHILE;

正确实现写法

兼容所有支持JSON函数的MySQL版本

WHILE i < JSON_LENGTH(_payments) DO
    SELECT JSON_UNQUOTE(_payments -> CONCAT('$[', i, '].name'));
    SET i = i + 1;
END WHILE;

说明:_payments -> CONCAT(...) 等价于 JSON_EXTRACT(_payments, CONCAT(...)),再通过JSON_UNQUOTE去除字符串引号,效果和->>完全一致。

MySQL 8.0.14及以上版本(支持动态JSON路径)

如果你的MySQL版本是8.0.14或更高,可以直接使用->>配合动态路径:

WHILE i < JSON_LENGTH(_payments) DO
    SELECT _payments ->> CONCAT('$[', i, '].name');
    SET i = i + 1;
END WHILE;

说明:该版本开始允许->>后面跟随动态生成的路径表达式,只需保证路径本身是正确的JSON格式(不要额外添加引号)。

内容的提问来源于stack exchange,提问作者John Yulber Inga Lapa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:03:30