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

MySQL - How to search within JSON datafield

我正在使用支持 JSON 数据字段的 MYSQL 5.7.11。

我的一个表中有一个 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,橙色的第二行价格 14.40,香蕉的第三行价格 40.00 和 42.00。只是为了说明这一点。

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

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

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

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

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

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

JsonPath.

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

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.