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.
我正在使用支持 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.