MySQL - JSON_EXTRACT在尝试操作JSON_LENGTH值时给出“无效的JSON路径表达式”错误

polhcujo  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(142)

我的表中有一个JSON列,名为Source_Data,其结构如下:

{
    "id": "1",
    "submissions": [
        {
            "requestDateTime": 123,
            "request": {},
            "response": {
                "result": "ACCEPTED",
                "submissionId": "ABC"
            }
        },
        {
            "requestDateTime": 456,
            "request": {},
            "response": {
                "result": "REJECTED",
                "submissionId": "XYZ"
            }
        }
    ]
}

我希望读取submissions数组中的最后一个元素,以及response对象中result的值。因此,所需的输出将被“拒绝”。
如果我尝试以下操作,MySQL不会 * 抛出错误:

SELECT
    JSON_EXTRACT(Source_Data, CONCAT('$.submissions[', JSON_LENGTH(Source_Data ->> '$.submissions'), '].response.result')) AS Submission_Response
FROM test;

这显然是错误的,因为数组从0开始计数,所以我需要执行JSON_LENGTH(Source_Data ->> "$.submissions") - 1,但这不起作用,并显示以下错误:
JSON路径表达式无效。错误在字符位置14附近。
一旦我添加了- 1,查询就会中断。
因此,违规查询如下:

SELECT
    JSON_EXTRACT(Source_Data, CONCAT('$.submissions[', JSON_LENGTH(Source_Data ->> '$.submissions') - 1, '].response.result')) AS Submission_Response
FROM test;

任何关于如何让这个工作的帮助将不胜感激,谢谢。我使用的MySQL版本5.7.25,所以不能使用'last'(我很喜欢)。

eanckbw9

eanckbw91#

我已经找出了这个错误的原因。我在表中有另一个记录,其submissions数组是空的。因此,在数组中检索条目的计算结果将是给予-1,MySQL会对JSON路径中的破折号产生问题。
因此,我将查询修改如下:

SELECT
    JSON_EXTRACT(Source_Data, 
        CONCAT(
            '$.submissions[',
            GREATEST(JSON_LENGTH(Source_Data ->> '$.submissions') - 1, 0), 
            '].response.result'
        )
    ) AS Submission_Response
FROM test;

相关问题