mysql - 如何在 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
解决方案
因为我只能猜测您的 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" |
推荐阅读
- javascript - JS/NodeJS WebSockets:尝试通过 https:// 连接 ws:// 时出现“混合内容”错误
- javascript - 在脚本中使用替代文本
- scala - scalafx 和 TableView:如何更改 slectionModel 和 focusModel?
- sql - 与本地 dockerized 的 postgres 连接
- ios - Smooch - 消息传递失败
- vba - PrintOut 设置为 3,但仅生成 1 个副本
- c++ - 在模板中,“std::result_of”中没有名为 type 的类型
" - javascript - for 循环使用 break 和 continue
- json - 我可以打印响应,但不能从 API 获取请求中获取单个值 SwiftUI
- amazon-web-services - 使用 aws elastic bean stalk 作为后端时,Socket.io ping 超时