JoeJ
JoeJ

Reputation: 172

MySql 8.0 - Filtered JSON query

I have a JSON blob that I am trying to extract a value from, specifically, the Zip Code under the Rating Information section (Expected value = 90703). Does MySql 8 support JSON filter expressions?

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
}

Path: $.items[?(@.name=="Rating Information")].categories.Zip Code

The path appears to be correct as I get data when testing via this site: https://jsonpath.com/

If MySql doesn't support JSON filtering, what is the recommended work around?

Joe

Upvotes: 1

Views: 1299

Answers (1)

Bill Karwin
Bill Karwin

Reputation: 562871

MySQL 8.0 and 8.1 does not implement full support for jsonpath expressions. For example, it does not support filtering expressions. The limited support for jsonpath is documented here: https://dev.mysql.com/doc/refman/8.0/en/json.html#json-path-syntax

The solution in MySQL for filtering JSON data is to use JSON_TABLE().

I tested your data:

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    |
+--------------------+----------+

You can then put a WHERE clause on the query to get the one you want.

Read more about JSON_TABLE(): https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

Upvotes: 2

Related Questions