从纯粹的MySQL中的JSON字符串中获取值

时间:2017-12-22 16:05:29

标签: mysql sql json

我正在寻找一个单一查询,它是纯粹的MySQL 。此查询的目标是利用SUBSTRING_INDEXCONCAT或其他所需内容,以便在字符串中查找值。

让我们说字符串看起来像这样: {"name":34,"otherName":55,"moreNames":12,"target":26,"hello":56,"hi":26,"asd":552,"p":3722,"bestName":11,"cc":6,"dd":10,}

我的目标是获得target的值,在本例中为26。但是,"target":26可能并不总是位于字符串中的该位置。任何其他属性都不会。最重要的是,值可能不总是26。我需要一些方法来检查"target":之后但,之后的"target":之前的数字。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

这一个?

create table sandbox (id integer, jsoncolumn varchar(255));
insert into sandbox values (1,'{"name":34,"otherName":55,"moreNames":12,"target":26,"hello":56,"hi":26,"asd":552,"p":3722,"bestName":11,"cc":6,"dd":10}');

mysql root@localhost:sandbox> SELECT jsoncolumn->'$.target' from sandbox;
+--------------------------+
|   jsoncolumn->'$.target' |
|--------------------------|
|                       26 |
+--------------------------+

https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

答案 1 :(得分:0)

Please try this function to get value from JSON string in MYSQL

DROP FUNCTION IF EXISTS CAP_FIRST_CHAR;

DELIMITER $$

CREATE FUNCTION getValueFromJsonSring(jsonStr VARCHAR(250), getKey VARCHAR(250))
  RETURNS VARCHAR(250) deterministic

BEGIN

  DECLARE output VARCHAR(250);  -- Holds the final value.
  DECLARE data VARCHAR(250);    -- Holds the exctracted value from JSON
  SET getKey=CONCAT('"',getKey,'"');
  SET data= TRIM(LEADING ':' FROM 
                substring_index(
                    substring_index(
                        substring_index(
                            substring_index(
                               SUBSTRING(jsonStr, 2, LENGTH(jsonStr)-2)
                                , getKey , '2'), 
                            getKey, 
                            -1
                          )
                        , ',', '1'), 
                    ',', 
                    -1
                )

            );
  SET output =SUBSTRING(data, 2, LENGTH(data)-2);

  RETURN output;
END;
$$
DELIMITER ;

SELECT getValueFromJsonSring('{"amount":"400.34","departmentId":"7","date":"2017-06-02","PONumber":"0000064873","vendor":"44"}',"departmentId");