微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析 JSON 对象并存储在 mysql 变量中

如何解决解析 JSON 对象并存储在 mysql 变量中

我正在尝试解析一个 json 数组及其对象,以便在我的 MysqL 过程中进一步使用它们。

但是在读取值时它显示为空。 _list 将包含

[{"floor_id":"5","length":"40"},{"floor_id":"6","length":"61"}]

代码

     CREATE DEFINER=`admin`@`%` PROCEDURE `manage_room`(IN _id INT,IN _list JSON,INOUT v_message varchar(1000),INOUT v_code int
                                                           
                                                        )
    BEGIN
    declare _floor_number int ;
declare floor_list_length int;
set floor_list_length =3;
                            iterator:
                            LOOP  
                                IF floor_list_length = 0 OR floor_list_length IS NULL THEN
                                    LEAVE iterator;
                                END IF;  
                                select JSON_EXTRACT(_rooms_list,CONCAT('$._list[',`floor_list_length`,'].floor_id')) as f ;
                                select JSON_EXTRACT(_rooms_list,'].length')) as l ;
                                insert into temp(val,txt) values (f,l);
            end loop;
    
    end

有人可以纠正我的错误吗?

解决方法

我认为您的意思是在与 JSON 输入文档中的数组对应的表 temp 中插入多行。 JSON 数组的每个成员都有一对字段,这两个字段应设置为 val 表中的 txttemp 列。

CREATE DEFINER=`admin`@`%` PROCEDURE `manage_room`(
  IN _id INT,IN _list JSON,INOUT v_message varchar(1000),INOUT v_code int
)
BEGIN
  DECLARE floor_list_length INT;
  DECLARE i INT DEFAULT 0;
  DECLARE element JSON;

  SET floor_list_length = JSON_LENGTH(_list);

  WHILE i < floor_list_length DO
    SET element = JSON_EXTRACT(_list,CONCAT('$[',i,']'));

    INSERT INTO temp
    SET val = JSON_EXTRACT(element,'$.floor_id'),txt = JSON_EXTRACT(element,'$.length');

    SET i = i + 1;
  END WHILE;
END

但这里有一个更简单的解决方案,假设您使用 MySQL 8.0。使用 JSON_TABLE() 将 JSON 转换为一组行,然后将该组直接插入到 temp 表中。

CREATE DEFINER=`admin`@`%` PROCEDURE `manage_room`(
  IN _id INT,INOUT v_code int
)
BEGIN
  INSERT INTO TEMP (val,txt)
  SELECT j.floor_id,j.length FROM JSON_TABLE(
    _list,'$[*]' COLUMNS(
      floor_id INT PATH '$.floor_id',length INT PATH '$.length'
    )
  ) AS j;
END

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。