我有一个表格,如下所示:
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作为字符串传递给此参数,并将每个对象作为行插入到表中
发布于 2018-06-20 04:55:47
您可以通过使用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,您可以使用use the compound statements outside of stored procedures。
https://stackoverflow.com/questions/50934184
复制相似问题