MySql 8.0 - 过滤后的 JSON 查询

MySql 8.0 - Filtered JSON query

我有一个 JSON blob,我正试图从中提取值,特别是评级信息部分下的邮政编码(预期值 = 90703)。 MySql 8 是否支持 JSON 过滤表达式?

JSON:

{
  "quote_number": null,
  "items": [
      {
          "annual_amount": 0.0,
          "pro_rata_amount": 0.0,
          "name": "Value Information",
          "categories": {
              "Use": "Single Family Detached",
              "Zip Code": "51431",
              "Floor Coverings": "Carpet"
          }
      },
      {
          "annual_amount": 0.0,
          "pro_rata_amount": 0.0,
          "name": "Rating Information",
          "categories": {
              "Number of Non-Weather Water Losses": "0",
              "Protection Class": "2",
              "Zip Code": "90703",
              "Special Hazard Interface Area": "N"
          }
      }
  ],
  "total": {
      "annual_fees": 0.0,
      "annual_premium": 9.0
  },
  "policy_id": null
}

路径:$.items[?(@.name==“评分信息”)].categories.Zip代码

路径似乎是正确的,因为我通过此站点测试时获取数据:https://jsonpath.com/

如果 MySql 不支持 JSON 过滤,建议的解决方法是什么?

MySQL 不完全支持 jsonpath 表达式。它不支持过滤表达式。此处记录了对 jsonpath 的有限支持:https://dev.mysql.com/doc/refman/8.0/en/json.html#json-path-syntax

我测试了你的数据:

set @j = '{ ...your json... }';

select * from json_table(@j, '$.items[*]' columns(
name text path '$.name',
zip_code text path '$.categories."Zip Code"'
)) as j;

+--------------------+----------+
| name               | zip_code |
+--------------------+----------+
| Value Information  | 51431    |
| Rating Information | 90703    |
+--------------------+----------+

然后您可以在查询中添加一个 WHERE 子句以获得您想要的结果。

阅读更多关于 JSON_TABLE() 的信息:https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html