如何在MySQL中编写可以解析列中JSON数据的查询?

Chr*_*lli 27 mysql json

我在MySQL中有一个表,它有一个存储JSON对象的列.如何轻松运行WHERE子句中可能包含某些JSON字段的查询?

EX:用一个名为的表 articles

+----+---------+--------------------------------------------------------------------------------------------------+
| id | user_id | json_data                                                                                        |
+----+---------+--------------------------------------------------------------------------------------------------+
|  1 |       1 | {"url":"https://www.cpubenchmark.net/","title": "CPU Benchmarks"}                                |
|  2 |       1 | {"url":"http://www.ebay.com/sch/CPUs-Processors-/164/i.html","title": "Computer and Processors"} |
|  3 |       2 | {"url":"https://www.youtube.com/watch?v=tntOCGkgt98","title": "Funny Cats Compilation"           |
+----+---------+--------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我希望能够写出如下内容:

   SELECT user_id, json_data FROM articles WHERE json_data.title LIKE "%CPU%"
Run Code Online (Sandbox Code Playgroud)

那应该只返回第一行.

Har*_*tel 21

提取json数据的简单查询示例,

这适用于 MySQL 和 MariaDB

1、JSON对象

SELECT JSON_EXTRACT('{"a":1,"b":"stringdata"}','$.b');
Run Code Online (Sandbox Code Playgroud)

输出:

"stringdata"
Run Code Online (Sandbox Code Playgroud)

2、JSON对象多层次

SELECT JSON_EXTRACT('{"a":1,"b":"stringdata","c":{"d":33}}','$.c.d') 
Run Code Online (Sandbox Code Playgroud)

输出 :

33
Run Code Online (Sandbox Code Playgroud)

3、JSON数组

SELECT JSON_EXTRACT('[1,2,3,4]','$[0]')
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)

4、JSON多级数组

SELECT JSON_EXTRACT('[1,2,3,[4,5]]','$[3][1]');
Run Code Online (Sandbox Code Playgroud)

输出:

5
Run Code Online (Sandbox Code Playgroud)


nor*_*ree 20

您可以使用json_extract(5.7以上)。 https://dev.mysql.com/doc/refman/5.7/zh-CN/json-search-functions.html#function_json-extract

SELECT user_id, json_data
FROM articles 
WHERE json_extract(json_data, '$.title') LIKE '%CPU%';
Run Code Online (Sandbox Code Playgroud)


Chr*_*lli 5

我最终以这种方式解决:带有UDF的https://github.com/ChrisCinelli/mysql_json。我详细介绍了如何编译它并将其安装在自述文件中。它为我在Ubuntu 12.04.5gcc version 4.6.3MySQL 5.5

您将能够运行:

SELECT json_get('{"a":1}', 'a')       => 1
SELECT json_get('{"a":1}', 'b')       => NULL
SELECT json_get('[1,2,3]', 2)         => 3
SELECT json_get('{"a":[2]}', 'a', 0)  => 2

#Also:

SELECT json_get('{"a":{"b":2}}', 'a') => object
SELECT json_get('{"a":[1,2,3]}', 'a') => array

# Verify if it is a valid JSON:

SELECT ISNULL(json_get('{"a":1}'));   => 0  # Valid
SELECT ISNULL(json_get('{"a":1'));    => 1  # Invalid

# Create an example table:

CREATE TABLE `message` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` text,
  PRIMARY KEY (`id`)
);
INSERT INTO message (id,data) VALUES(1,'{"from":"chris","title":"Awesome Article","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit."}');
INSERT INTO message (id,data) VALUES(2,'{"from":"loren","title":"Another Article","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit."}');
INSERT INTO message (id,data) VALUES(3,'{"from":"jason","title":"How to run a query","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit."}');

# Run queries on JSON values:

SELECT json_get(data,'title') FROM message WHERE id=2;
SELECT id,data FROM message WHERE json_get(data,'from')='chris';
SELECT id,data FROM message WHERE json_get(data,'title') LIKE '%Article%';
Run Code Online (Sandbox Code Playgroud)

  • 我有 5.5.14 并且 FUNCTION json_get 不存在 (3认同)

Tim*_*sen 3

尝试以下查询并查看它是否符合您的需求:

SELECT user_id, json_data
FROM articles
WHERE common_schema.extract_json_value(json_data,'title')
LIKE "%CPU%"
Run Code Online (Sandbox Code Playgroud)

这仅适用于MySQL5.1 或更高版本。

  • 我们使用 >= 5.5。我得到:`FUNCTION common_schema.extract_json_value 不存在`。我认为要使用它,我需要安装:https://code.google.com/p/common-schema/ - 我实际上开始寻找另一个插件。 (3认同)