从jsonarray向mysql表插入记录

bzzcjhmw  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(627)

我有一张table:

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

像这样的雅索纳里:

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

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

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

在jason\u extract函数中,我应该用什么来代替“?”标记?
我有一个带有varchar参数的存储过程,我想将jsonarray作为字符串传递给这个参数,并将每个对象作为一行插入表中

inkz8wg9

inkz8wg91#

你可以用 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;

另一个选择是使用序列引擎和 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,可以在存储过程之外使用复合语句。

相关问题