【问题标题】:Insert records to MySQL table from JSONArray从 JSONArray 向 MySQL 表中插入记录
【发布时间】:2018-11-28 18:12:26
【问题描述】:

我有一张桌子:

CREATE TABLE `mydb`.`mytable` (
  `id` INT NOT NULL,
  `name` VARCHAR(50) NULL,
  PRIMARY KEY (`id`));

还有一个像这样的 JASONArray:

[{"id":1, "name":"X"}, {"id":2, "name":"Y"},{"id":3,"name":"Z"}]

是否可以从数组中提取每个 JSONObject 并将其插入到表中?或类似的东西:

Insert Into mytable Select From JSON_EXTRACT(@JsonArray, '?')

我应该使用什么来代替“?”在 JASON_Extract 函数中标记?

我有一个带有 Varchar 参数的存储过程,我想将我的 JSONArray 作为字符串传递给这个参数,并将每个对象作为一行插入到表中

【问题讨论】:

    标签: mysql sql json mariadb


    【解决方案1】:

    您可以通过使用 JSON_VALUE 并遍历数组来做到这一点:

    CREATE OR REPLACE TABLE t1(id INT, name VARCHAR(100));
    
    DELIMITER // ;
    
    CREATE OR REPLACE PROCEDURE p(IN json TEXT)
    BEGIN
        -- Our loop variable                                                                                                                                                                      
        DECLARE i INT DEFAULT 0;
        -- How long our JSON array is                                                                                                                                                             
        DECLARE e INT DEFAULT JSON_LENGTH(json);
    
        WHILE i < e DO
            -- Get the values at array offset `i` and insert them into the table                                                                                                                  
            INSERT INTO t1 VALUES (JSON_VALUE(json, CONCAT('$[', i, '].id')), JSON_VALUE(json, CONCAT('$[', i, '].name')));
            -- Increment the loop variable                                                                                                                                                        
            SET i = i + 1;
        END WHILE;
    END //
    
    DELIMITER ; //
    
    -- Call the procedure and examine results                                                                                                                                                     
    SET @json := '[{"id":1, "name":"X"}, {"id":2, "name":"Y"},{"id":3,"name":"Z"}]';
    CALL p(@json);
    SELECT * FROM t1;
    

    另一种选择是使用 SEQUENCE 引擎和INSERT SELECT

    INSERT INTO t1 SELECT
           JSON_VALUE(@json, CONCAT('$[', seq, '].id')) AS id,
           JSON_VALUE(@json, CONCAT('$[', seq, '].name')) AS name
    FROM seq_0_to_1000000
    WHERE seq < JSON_LENGTH(@json);
    

    seq_0_to_1000000 的使用不是很整齐。使用 MariaDB,您可以use the compound statements outside of stored procedures

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2018-06-12
      • 2017-11-16
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多