如何在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
相关产品推荐
相关产品推荐

