【问题标题】:Parsing JSON objects and storing in mysql variables解析 JSON 对象并存储在 mysql 变量中
【发布时间】:2021-09-20 12:18:13
【问题描述】:

我正在尝试解析一个 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,CONCAT('$._list[', `floor_list_length`, '].length')) as l ;
                                insert into temp(val,txt) values (f,l);
            end loop;
    
    end

谁能纠正我做错了什么?

【问题讨论】:

  • 试试:SELECT JSON_EXTRACT(`_list`, '$[0].floor_id') as f ;.
  • 恕我直言,错误太多了,不知从何说起。输入参数是_list,但您将其引用为_rooms_list。然后您在 JSON 路径中使用 $._list,但该密钥不会出现在 JSON 内容中。你声明了一个变量_floor_number,但你没有使用它。然后你使用一个变量floor_list_length 而不声明它或设置一个值。您尝试使用别名从 JSON 中选择字段,但未将它们设置为任何变量。然后你使用fl,就好像它们是变量一样。这个过程完全是胡言乱语。
  • 您编辑了您的问题,添加了_floor_number 的声明并将其设置为3。但是还有很多其他问题。
  • @BillKarwin 抱歉,这不是完整的代码。我的想法是给出一个想法,我想在程序中实现什么。我应该给出完整的代码:-(

标签: mysql json stored-procedures mysql-json


【解决方案1】:

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

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,
  IN _list JSON,                                                    
  INOUT v_message varchar(1000),
  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

【讨论】:

  • 非常感谢。我能够使用 wchiquito 提到的语法来解决它。您的代码包含有关提取值的不同方法的更多信息。我也在摆弄文档。感谢您的耐心:-)
猜你喜欢
  • 2022-01-12
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
相关资源
最近更新 更多