Using Searched Case

A searched case expression can be helpful in identifying specific problems with the JSON data in your JSON columns. The example data we have been using in this chapter sometimes provides a JSONPersons.address field, and sometimes it does not. When an address is present, sometimes it provides a zipcode, and sometimes it does not. We can use a searched case expression to identify and describe the specific problem with each row.

sql->  SELECT id, 
CASE
    WHEN NOT EXISTS j.person.address
    THEN j.person.keys()
    WHEN NOT EXISTS j.person.address.zipcode
    THEN "No Zipcode"
    ELSE j.person.address.zipcode
END
FROM JSONPersons j;
 +----+-----------------------+
 | id |       Column_2        |
 +----+-----------------------+
 |  4 | No Zipcode            |
 +----+-----------------------+
 |  3 | No Zipcode            |
 +----+-----------------------+
 |  5 | No Zipcode            |
 +----+-----------------------+
 |  1 | 37013                 |
 +----+-----------------------+
 |  7 | myarray               |
 |    | mynumber              |
 +----+-----------------------+
 |  6 | myarray               |
 |    | mynumber              |
 +----+-----------------------+
 |  2 | 53511                 |
 +----+-----------------------+

7 rows returned 

We can improve the report by adding a third column that uses a second searched case expression:

sql-> SELECT id,
CASE
    WHEN NOT EXISTS j.person.address
    THEN "No Address"
    WHEN NOT EXISTS j.person.address.zipcode
    THEN "No Zipcode"
    ELSE j.person.address.zipcode
END,
CASE
    WHEN NOT EXISTS j.person.address
    THEN j.person.keys()
    ELSE j.person.address
END
FROM JSONPersons j;
 +----+-----------------------+------------------------------------+
 | id |       Column_2        |              Column_3              |
 +----+-----------------------+------------------------------------+
 |  3 | No Zipcode            | city         | Middleburg          |
 |    |                       | phones                             |
 |    |                       |     areacode | 305                 |
 |    |                       |     number   | 1234079             |
 |    |                       |     type     | work                |
 |    |                       |                                    |
 |    |                       |     areacode | 305                 |
 |    |                       |     number   | 2066401             |
 |    |                       |     type     | home                |
 |    |                       | state        | FL                  |
 |    |                       | street       | 187 Aspen Drive     |
 +----+-----------------------+------------------------------------+
 |  2 | 53511                 | city         | Beloit              |
 |    |                       | phones                             |
 |    |                       |     areacode | 339                 |
 |    |                       |     number   | 1684972             |
 |    |                       |     type     | home                |
 |    |                       | state        | WI                  |
 |    |                       | street       | 187 Hill Street     |
 |    |                       | zipcode      | 53511               |
 +----+-----------------------+------------------------------------+
 |  5 | No Zipcode            | city         | Monroe Township     |
 |    |                       | phones                             |
 |    |                       |     areacode | 201                 |
 |    |                       |     number   | 3213267             |
 |    |                       |     type     | work                |
 |    |                       |                                    |
 |    |                       |     areacode | 201                 |
 |    |                       |     number   | 8765421             |
 |    |                       |     type     | work                |
 |    |                       |                                    |
 |    |                       |     areacode | 339                 |
 |    |                       |     number   | 3414578             |
 |    |                       |     type     | home                |
 |    |                       | state        | NJ                  |
 |    |                       | street       | 427 Linden Avenue   |
 +----+-----------------------+------------------------------------+
 |  1 | 37013                 | city         | Antioch             |
 |    |                       | phones                             |
 |    |                       |     areacode | 423                 |
 |    |                       |     number   | 8634379             |
 |    |                       |     type     | home                |
 |    |                       | state        | TN                  |
 |    |                       | street       | 150 Route 2         |
 |    |                       | zipcode      | 37013               |
 +----+-----------------------+------------------------------------+
 |  7 | No Address            | myarray                            |
 |    |                       | mynumber                           |
 +----+-----------------------+------------------------------------+
 |  4 | No Zipcode            | city         | Leominster          |
 |    |                       | phones                             |
 |    |                       |     areacode | 339                 |
 |    |                       |     number   | 4120211             |
 |    |                       |     type     | work                |
 |    |                       |                                    |
 |    |                       |     areacode | 339                 |
 |    |                       |     number   | 8694021             |
 |    |                       |     type     | work                |
 |    |                       |                                    |
 |    |                       |     areacode | 339                 |
 |    |                       |     number   | 1205678             |
 |    |                       |     type     | home                |
 |    |                       |                null                |
 |    |                       |                                    |
 |    |                       |     areacode | 305                 |
 |    |                       |     number   | 8064321             |
 |    |                       |     type     | home                |
 |    |                       | state        | MA                  |
 |    |                       | street       | 364 Mulberry Street |
 +----+-----------------------+------------------------------------+
 |  6 | No Address            | myarray                            |
 |    |                       | mynumber                           |
 +----+-----------------------+------------------------------------+

7 rows returned 

Finally, it is possible to nest search case expressions. Our sample data also has a spurious null in the phones array (see id 4). We can report that in the following way (output is modified slightly to fit in the space allowed):

sql-> SELECT id,
CASE
    WHEN EXISTS j.person.address
    THEN
       CASE
          WHEN EXISTS j.person.address.zipcode
          THEN
             CASE
                WHEN j.person.address.phones[] =any null
                THEN "Zipcode exists but null in the phones array"
                ELSE j.person.address.zipcode
             END
          WHEN j.person.address.phones[] =any null
          THEN "No zipcode and null in phones array"
          ELSE "No zipcode"
       END
    ELSE "No Address"
END,
CASE
    WHEN NOT EXISTS j.person.address
    THEN j.person.keys()
    ELSE j.person.address
END 
FROM JSONPersons j;
 +----+------------------------+------------------------------------+
 | id |   Column_2             |              Column_3              |
 +----+------------------------+------------------------------------+
 |  3 | No zipcode             | city         | Middleburg          |
 |    |                        | phones                             |
 |    |                        |     areacode | 305                 |
 |    |                        |     number   | 1234079             |
 |    |                        |     type     | work                |
 |    |                        |                                    |
 |    |                        |     areacode | 305                 |
 |    |                        |     number   | 2066401             |
 |    |                        |     type     | home                |
 |    |                        | state        | FL                  |
 |    |                        | street       | 187 Aspen Drive     |
 +----+------------------------+------------------------------------+
 |  2 | 53511                  | city         | Beloit              |
 |    |                        | phones                             |
 |    |                        |     areacode | 339                 |
 |    |                        |     number   | 1684972             |
 |    |                        |     type     | home                |
 |    |                        | state        | WI                  |
 |    |                        | street       | 187 Hill Street     |
 |    |                        | zipcode      | 53511               |
 +----+------------------------+------------------------------------+
 |  5 | No zipcode             | city         | Monroe Township     |
 |    |                        | phones                             |
 |    |                        |     areacode | 201                 |
 |    |                        |     number   | 3213267             |
 |    |                        |     type     | work                |
 |    |                        |                                    |
 |    |                        |     areacode | 201                 |
 |    |                        |     number   | 8765421             |
 |    |                        |     type     | work                |
 |    |                        |                                    |
 |    |                        |     areacode | 339                 |
 |    |                        |     number   | 3414578             |
 |    |                        |     type     | home                |
 |    |                        | state        | NJ                  |
 |    |                        | street       | 427 Linden Avenue   |
 +----+------------------------+------------------------------------+
 |  1 | 37013                  | city         | Antioch             |
 |    |                        | phones                             |
 |    |                        |     areacode | 423                 |
 |    |                        |     number   | 8634379             |
 |    |                        |     type     | home                |
 |    |                        | state        | TN                  |
 |    |                        | street       | 150 Route 2         |
 |    |                        | zipcode      | 37013               |
 +----+------------------------+------------------------------------+
 |  7 | No Address             | myarray                            |
 |    |                        | mynumber                           |
 +----+------------------------+------------------------------------+
 |  4 | No zipcode and null    | city         | Leominster          |
 |    | in phones array        | phones                             |
 |    |                        |     areacode | 339                 |
 |    |                        |     number   | 4120211             |
 |    |                        |     type     | work                |
 |    |                        |                                    |
 |    |                        |     areacode | 339                 |
 |    |                        |     number   | 8694021             |
 |    |                        |     type     | work                |
 |    |                        |                                    |
 |    |                        |     areacode | 339                 |
 |    |                        |     number   | 1205678             |
 |    |                        |     type     | home                |
 |    |                        |                null                |
 |    |                        |                                    |
 |    |                        |     areacode | 305                 |
 |    |                        |     number   | 8064321             |
 |    |                        |     type     | home                |
 |    |                        | state        | MA                  |
 |    |                        | street       | 364 Mulberry Street |
 +----+------------------------+------------------------------------+
 |  6 | No Address             | myarray                            |
 |    |                        | mynumber                           |
 +----+------------------------+------------------------------------+

7 rows returned