MySQL - 如何在 JSON 数据字段中搜索

标签 mysql jsonpath mysql-5.7 mysql-json

我使用的是 MYSQL 5.7.11,它支持 JSON 数据字段。

我的一个表中有一个 JSON 字段,用于存储产品的价格历史记录:

JSON 结构示例:

[{"da": "2016-05-03 08:32", "pr":15.90}] 
[{"da": "2016-03-22 09:02", "pr":14.40}]
[{"da": "2016-03-15 12:08", "pr":40.00}, {"da": "2016-06-28 10:32", "pr":42.00}]
[{"da": "2016-03-29 02:39", "pr":13.90}]
[{"da": "2016-05-03 08:38", "pr":17.90},{"da": "2016-07-19 10:18", "pr":26.80},{"da": "2016-07-19 14:20", "pr":24.80}]

如您所见,一行中可以有多个 JSON 数组。示例中的每个 JSON 行代表不同的产品。 就像第一行价格 15.90 是针对 APPLE 的,第二行价格 14.40 是针对橙色的,第三行价格是 40.00 和 42.00 是针对香蕉的。只是为了澄清这一点。

我正在寻找的是能够在日期范围之间进行搜索。

例如获取日期 A 到日期 B 之间的所有产品价格历史记录。

出于测试目的,我尝试做这样的事情:

select json_extract(json_price_history, '$.pr')=13.90 from products

但它总是返回许多只包含 NULL 的行。

如有任何帮助,我们将不胜感激...

最佳答案

JsonPath。

查询中的 jsonpath 正在寻找从 JSON 字典中提取名为 pr 的元素。但你的表不包含字典。它有一个数组,其中每个元素都是一个字典。因此查询应更改如下;

SELECT JSON_EXTRACT(DICT, '$[*].pr') FROM myjson;

这将向您显示如下内容:

+---------------------------------------------+
| JSON_UNQUOTE(JSON_EXTRACT(DICT, '$[*].pr')) |
+---------------------------------------------+
| NULL                                        |
| [15.9]                                      |
| [14.4]                                      |
| [40, 42]                                    |
| [13.9]                                      |
| [17.9, 26.8, 24.8]                          |
+---------------------------------------------+

在 RDBMS 中存储数组

将数组存储在 RDBMS 中是完全可以的。但是,如果您发现自己必须在这些数组中搜索某些内容,则意味着您的数据库设计错误。我还没有在 mysql 文档中看到明确提到这一点,但是 postgreql 在那里你可以得到很多[更高级的 json 和数组支持][1] 对此非常清楚。

Tip: Arrays are not sets; searching for specific array elements can be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale better for a large number of elements.

关于MySQL - 如何在 JSON 数据字段中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38538987/

相关文章:

java - 如何在 Java 中获取 JSONpath 的所有输出路径,以便通过它们本身的函数替换现有值

JSONPath - 获取对象 othervalue 等于字符串的所有值

mysql5.7 json对象——查询一个数组的元素

php - 从 mysql 数组中获取值并从字段中匹配

python - 如何使用 MySQLdb 格式化多个字符串 (%s)?

php - mysql where 子句不返回空?

xml - 从 JSON 字符串中读取数组元素的 XPath

带别名的 MySQL SELECT 查询在 MySQL 5.7.28 中不起作用

MYSQL django测试错误: django. db.utils.InternalError : (7,“重命名时出错

php - SELECT 查询准备语句输出