我使用的是 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/