I have some sql that I want to pass into a mysql stored procedure. I'm using the json functions in mysql-json-udfs-0.4.0-labs-json-udfs-linux-glibc2.5-x86_64. We are running a mysql 5.5.4 server. Updating to 5.7.x is an option.
我有一些sql,我想传递给mysql存储过程。我在mysql-json-udfs-0.4.0-labs-json-udfs-linux-glibc2.5-x86_64中使用了json函数。我们正在运行一个mysql 5.5.4服务器。更新到5.7.x是一个选项。
When I run
当我跑
set @mapJSON = '[{"from":12,"to":0},{"from":11,"to":-1},{"from":1,"to":1}]' ;
select json_extract(@mapJSON,'from') `from`,json_extract(@mapJSON,'to') `to` ;
I am expecting
我在期待
from to
12 0
11 -1
1 1
I am getting
我正进入(状态
from to
{"from":12,"to":0} {"from":12,"to":0}
The question is how to extract rows from a json array using the udf json_extract 0.4.0?
问题是如何使用udf json_extract 0.4.0从json数组中提取行?
I solved this for the moment by using comma_schema with json as
我通过使用带有json的comma_schema来解决这个问题
{
"map": [
{
"from": 12,
"to": 0
},
{
"from": 1,
"to": 10
},
{
"from": 2,
"to": 20
},
{
"from": 3,
"to": 30
},
{
"from": 4,
"to": 40
},
{
"from": 5,
"to": 50
},
{
"from": 6,
"to": 60
},
{
"from": 7,
"to": 70
},
{
"from": 8,
"to": 80
},
{
"from": 9,
"to": 90
},
{
"from": 10,
"to": 100
}
]
}
which gives the result after running
它在运行后给出结果
select `common_schema`.`extract_json_value`(@mapJSON,'/map/from') `from`,`common_schema`.`extract_json_value`(@mapJSON,'/map/to') `to` ;
as space delimited strings
作为空格分隔的字符串
from to
12 1 2 3 4 5 6 7 8 9 10 0 10 20 30 40 50 60 70 80 90 100
which I then extract using where @recommendationMapJSON is the new json being passed into the stored procedure.
然后我使用@recommendationMapJSON提取的新json被传递到存储过程中。
create temporary table temporary_recommendation_maps AS (
select `common_schema`.`extract_json_value`(@recommendationMapJSON,'/map/from') `from`,`common_schema`.`extract_json_value`(@recommendationMapJSON,'/map/to') `to`
) ;
create temporary table temporary_recommendation_map (
`from` int ,
`to` int
) ;
select length(`from`) - length(replace(`from`,' ','')) +1 into @mapCount from temporary_recommendation_maps ;
set @mapIndex = 0 ;
while @mapIndex < @mapCount do
select substring_index(`from`,' ',1) into @from from temporary_recommendation_maps ;
select substring_index(`to`,' ',1) into @to from temporary_recommendation_maps ;
insert into temporary_recommendation_map(`from`,`to`) values (@from,@to) ;
update temporary_recommendation_maps
set `from` = substring(`from`,instr(`from`,' ')+1)
, `to` = substring(`to`,instr(`to`,' ')+1) ;
set @mapIndex = @mapIndex + 1 ;
end while ;
update temporary_recommendation_maps
set `from` = ''
, `to` = '' ;
which gives the map that I wanted.
它给出了我想要的地图。
select * from temporary_recommendation_map ;
from to
12 0
1 10
2 20
3 30
4 40
5 50
6 60
7 70
8 80
9 90
10 100
3 个解决方案
#1
1
Your syntax inside json_extract()
was a bit off. Try using this instead:
你在json_extract()里面的语法有点偏。请尝试使用此代码:
SET @mapJSON = '[{"from":12,"to":0},{"from":11,"to":-1},{"from":1,"to":1}]' ;
SELECT JSON_EXTRACT(@mapJSON, "$.from") AS `from`,
JSON_EXTRACT(@mapJSON, "$.to") AS `to`
This should give you a result set looking something like this:
这应该给你一个看起来像这样的结果集:
from to
[12, 11, 1] [0, -1, 1]
#2
0
Use index to get array value.
使用index获取数组值。
$[ index ]
sample:
SELECT JSON_EXTRACT(@mapJSON, "$[0].from") AS 'from',
JSON_EXTRACT(@mapJSON, "$[0].to") AS 'to' ;
#3
0
try this code.
试试这段代码。
DROP TABLE IF EXISTS tmp;
DROP PROCEDURE IF EXISTS teste;
DELIMITER $$
CREATE PROCEDURE teste()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE jCount INT DEFAULT -1;
CREATE TEMPORARY TABLE tmp( ou_from INT, out_to INT );
SET @mapJSON = '[{"from":12,"to":0},{"from":11,"to":-1},{"from":1,"to":1},{"a":"teste"}]' ;
SET jCount = jCount + JSON_LENGTH( @mapJSON, '$' );
WHILE ( i <= jCount ) DO
INSERT INTO tmp( ou_from, out_to )
VALUES( JSON_EXTRACT(@mapJSON, CONCAT( '$[', i, '].from') )
, JSON_EXTRACT(@mapJSON, CONCAT( '$[', i, '].to' ) )
);
SET i = i + 1;
END WHILE;
SELECT ou_from AS 'from', out_to AS 'to' FROM tmp;
/*
SELECT JSON_EXTRACT(@mapJSON, "$[1].from") AS 'from',
JSON_EXTRACT(@mapJSON, "$[1].to") AS 'to' ;
*/
END $$
DELIMITER ;
CALL teste;
#1
1
Your syntax inside json_extract()
was a bit off. Try using this instead:
你在json_extract()里面的语法有点偏。请尝试使用此代码:
SET @mapJSON = '[{"from":12,"to":0},{"from":11,"to":-1},{"from":1,"to":1}]' ;
SELECT JSON_EXTRACT(@mapJSON, "$.from") AS `from`,
JSON_EXTRACT(@mapJSON, "$.to") AS `to`
This should give you a result set looking something like this:
这应该给你一个看起来像这样的结果集:
from to
[12, 11, 1] [0, -1, 1]
#2
0
Use index to get array value.
使用index获取数组值。
$[ index ]
sample:
SELECT JSON_EXTRACT(@mapJSON, "$[0].from") AS 'from',
JSON_EXTRACT(@mapJSON, "$[0].to") AS 'to' ;
#3
0
try this code.
试试这段代码。
DROP TABLE IF EXISTS tmp;
DROP PROCEDURE IF EXISTS teste;
DELIMITER $$
CREATE PROCEDURE teste()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE jCount INT DEFAULT -1;
CREATE TEMPORARY TABLE tmp( ou_from INT, out_to INT );
SET @mapJSON = '[{"from":12,"to":0},{"from":11,"to":-1},{"from":1,"to":1},{"a":"teste"}]' ;
SET jCount = jCount + JSON_LENGTH( @mapJSON, '$' );
WHILE ( i <= jCount ) DO
INSERT INTO tmp( ou_from, out_to )
VALUES( JSON_EXTRACT(@mapJSON, CONCAT( '$[', i, '].from') )
, JSON_EXTRACT(@mapJSON, CONCAT( '$[', i, '].to' ) )
);
SET i = i + 1;
END WHILE;
SELECT ou_from AS 'from', out_to AS 'to' FROM tmp;
/*
SELECT JSON_EXTRACT(@mapJSON, "$[1].from") AS 'from',
JSON_EXTRACT(@mapJSON, "$[1].to") AS 'to' ;
*/
END $$
DELIMITER ;
CALL teste;