我正在使用支持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行代表不同的产品。 就像APPLE的第一个ROW价格15.90一样,第二个ROW 14.40用于ORANGE,第三个40.00和42.00用于BANANA。只是为了说清楚。
我正在寻找的是能够在各种日期之间进行搜索。
像获取日期A到日期B之间的所有产品价格历史记录。
出于测试目的,我试图做这样的事情:
select json_extract(json_price_history, '$.pr')=13.90 from products
但它总是返回很多只有NULL的行。
任何帮助将不胜感激......
答案 0 :(得分:2)
查询中的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中是完美的。但是,如果您发现自己必须在这些数组中搜索某些内容,则意味着您的数据库设计错误。我没有看到在mysql文档中明确提到的这个,但postgreql你得到了更多[更高级的json和数组支持] [1]对此非常清楚。
提示:数组不是集合;搜索特定的数组元素即可 数据库错误设计的标志。考虑使用单独的表格 每个项目的行都是一个数组元素。这会更容易 搜索,并可能为大量的更好地扩展 元件。