【问题标题】:How to loop through JSON data in MySQL如何在 MySQL 中循环遍历 JSON 数据
【发布时间】:2020-10-06 23:04:07
【问题描述】:

我想使用计数器循环遍历 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

【问题讨论】:

  • 请向我们展示 created_slots 的示例。在您的情况下错误的路径基本上是文本,因此您可以将变量连接到它,但为此您的 json 必须正确
  • 在这里发帖时请不要大喊大叫。全部大写的文本更难阅读和理解,并且不会更快地为您提供帮助。当您寻求免费帮助时,来到这里对我们大喊大叫也是相当不礼貌的。谢谢。
  • @nbk 请查看编辑后的帖子。当我离开 mysql 工作台时,我的坏人忘记关掉我的帽子
  • 那不是有效的json,请看是否可以创建一个只有一行的dbfiddle
  • @nbk 抱歉,这是我在测试 api 时从邮递员那里得到的回复。上面的代码是对 API 调用的函数的修改。请参阅我建议的替代解决方案。如果能实现就更简单了。

标签: mysql arrays json


【解决方案1】:

因为我只能猜测您的 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"                         |

View on DB Fiddle

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多