首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从JSONArray向MySQL表插入记录

从JSONArray向MySQL表插入记录
EN

Stack Overflow用户
提问于 2018-06-20 01:44:39
回答 1查看 2K关注 0票数 1

我有一个表格,如下所示:

代码语言:javascript
复制
CREATE TABLE `mydb`.`mytable` (
  `id` INT NOT NULL,
  `name` VARCHAR(50) NULL,
  PRIMARY KEY (`id`));

和一个像这样的JASONArray:

代码语言:javascript
复制
[{"id":1, "name":"X"}, {"id":2, "name":"Y"},{"id":3,"name":"Z"}]

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

代码语言:javascript
复制
Insert Into mytable Select From JSON_EXTRACT(@JsonArray, '?')

我应该用什么来代替'?‘是否在JASON_Extract函数中进行标记?

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

EN

回答 1

Stack Overflow用户

发布于 2018-06-20 04:55:47

您可以通过使用JSON_VALUE并循环遍历数组来完成此操作:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50934184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档