Mysql如何提取存储的JSON值

时间:2017-03-08 12:46:38

标签: php mysql json

如何将存储在字段中的值提取为json。 customerId当前存储在juniferResponse字段中,如{“customerId”:1}

以下内容在我正在使用的mysql版本中不起作用:

SELECT json_extract(juniferResponse, '$.customerId') AS cid FROM enrolment WHERE juniferResponse IS_NOT_NULL;

我需要从juniferResponse中提取字段,该字段不为null或为空。

2 个答案:

答案 0 :(得分:0)

如果你不能将MySQL升级到5.7.8或更高。 可以使用下面的选择:

SET @a='{"z":"\\"customerId\\"","customerId":41,"a":1,"b2":2}';

SELECT IF(LOCATE('"customerId":',@a)>0,1*substring(@a,LOCATE('"customerId":',@a)+13),NULL);

如果customerId键不存在,则select返回NULL

13 is the number of letters in the locate string ["customerId":]

或者创建如下的函数。哪个更有用

DELIMITER  //
CREATE FUNCTION json_extract_int (jstring TEXT,jkey CHAR(20))
RETURNS INT(11)
BEGIN
SET jkey = CONCAT('"',jkey,'":');
RETURN IF(LOCATE(jkey,jstring)>0,1*substring(jstring,LOCATE(jkey,jstring)+LENGTH(jkey)),NULL);
END//
DELIMITER ;

现在很容易使用

SELECT json_extract_int(@a,'customerId');
+-----------------------------------+
| json_extract_int(@a,'customerId') |
+-----------------------------------+
|                                41 |
+-----------------------------------+

或者你的情况

SELECT json_extract_int(juniferResponse,'customerId');

答案 1 :(得分:-1)

如果无法升级mysql服务器以使用json_extract,并且无法在应用程序中使用json_decode,则可以使用MID和LOCATE。 但是你的json必须像{“some_key”:some_number} 您可以使用以下查询:

SELECT 
MID(
    juniferResponse, 
    LOCATE(':', juniferResponse) + 1, 
    LOCATE('}', juniferResponse) - LOCATE(':', juniferResponse) - 1 
    ) AS cid
FROM `exam`
WHERE juniferResponse IS NOT NULL