首页 > 解决方案 > 如何在 MySQL 中循环遍历 JSON 数据

问题描述

我想使用计数器循环遍历 mysql 中的 JSON 数据,但我不断收到此错误:

        "code": "ER_INVALID_JSON_PATH",
        "errno": 3143,
        "sqlMessage": "Invalid JSON path expression. The error is around character position 2.",
        "sqlState": "42000",
        "index": 0,

来自 created_slots 的示例表。这是一个包含时间的 JSON 数组 这是我从 Postman 得到的响应:

"slots": "[\"11:00:00.000000\", \"12:00:00.000000\", \"12:30:00.000000\", \"13:00:00.000000\", \"13:30:00.000000\", \"14:00:00.000000\", \"14:30:00.000000\", \"15:00:00.000000\", \"15:30:00.000000\", \"16:00:00.000000\", \"16:30:00.000000\", \"17:00:00.000000\", \"17:30:00.000000\"]"

注意: created_slots 是一个 JSON 数组

看来计数器不是有效的参考。有没有办法在字符串中解析它。这是我下面的代码:

      IF c_time > start_time THEN 
            removal_loop : LOOP
                IF JSON_EXTRACT(created_slots, '$[loop_counter]') <> 0 THEN
                    
                    IF JSON_EXTRACT(created_slots, '$[loop_counter]') < c_time THEN 
                        SET created_slots = JSON_REMOVE(created_slots, '$[loop_counter]');
                        SET loop_counter = loop_counter + 1;
                    ELSE
                        SET loop_counter = loop_counter + 1;
                    END IF;
                ELSE
                    LEAVE removal_loop;
                END IF;
            END LOOP removal_loop;
        END IF;

替代解决方案:

 IF JSON_EXTRACT(m_begin, '$[*]') < c_time THEN
     SET created_slots = JSON_REMOVE(m_begin, '$[refernece to current item]')
 ... remove here, but I can't use this line of code because everything 
  will be deleted. I need a reference to the item that is less than 
  c_time

标签: mysqlarraysjson

解决方案


因为我只能猜测您的 json 是什么样的,但是您应该始终创建一个示例,因为我们需要 [mre]

如果 json 正确,则需要以下路径

架构 (MySQL v8.0)

CREATE TABLE t1 (created_slots JSON);


INSERT INTO t1 VALUES('{ "slots": ["11:00:00.000000", "12:00:00.000000", "12:30:00.000000", "13:00:00.000000", "13:30:00.000000", "14:00:00.000000", "14:30:00.000000", "15:00:00.000000", "15:30:00.000000", "16:00:00.000000", "16:30:00.000000", "17:00:00.000000", "17:30:00.000000"]}');

查询 #1

SELECT 
JSON_EXTRACT(created_slots, '$.slots[0]')
FROM t1;

| JSON_EXTRACT(created_slots, '$.slots[0]') |
| ----------------------------------------- |
| "11:00:00.000000"                         |

在 DB Fiddle 上查看


推荐阅读