如何使用mysql udf json_extract 0.4.0从json数组中提取行?

时间:2021-08-18 15:54:18

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;