Search code examples
mysqlmysql-8.0mysql-json

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


Solution

  • 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