MySQL中JSON_EXTRACT结合JSON_LENGTH取数组最后元素时报错问题
解决MySQL 5.7中获取JSON数组最后一个元素的问题
针对你的场景,要在MySQL 5.7.25中读取JSON数组submissions最后一个元素的response.result,可以通过以下两种方法解决:
方法1:用括号明确运算优先级
原查询报错是因为运算符优先级问题,导致生成了错误的JSON路径表达式。给JSON_LENGTH(...) - 1加上括号,确保先计算出正确的数组下标,再拼接成合法的JSON路径:
SELECT JSON_EXTRACT(Source_Data, CONCAT('$.submissions[', (JSON_LENGTH(Source_Data ->> '$.submissions') - 1), '].response.result')) AS Submission_Response FROM test;
也可以用->>简化写法,直接提取不带引号的字符串结果:
SELECT Source_Data ->> CONCAT('$.submissions[', (JSON_LENGTH(Source_Data ->> '$.submissions') - 1), '].response.result') AS Submission_Response FROM test;
方法2:子查询预先计算数组长度
如果觉得嵌套表达式不够直观,可以先在子查询中算出数组长度,再在外层处理下标拼接:
SELECT JSON_EXTRACT(Source_Data, CONCAT('$.submissions[', len - 1, '].response.result')) AS Submission_Response FROM ( SELECT Source_Data, JSON_LENGTH(Source_Data ->> '$.submissions') AS len FROM test ) AS t;
原理说明
MySQL 5.7中JSON数组下标从0开始,JSON_LENGTH(Source_Data ->> '$.submissions')返回数组元素个数(示例中为2),减1后得到最后一个元素的下标(1)。通过括号或子查询确保数值计算优先于字符串拼接,就能生成合法的JSON路径$.submissions[1].response.result,从而正确提取目标值REJECTED。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

