検索Caseの使用方法

検索case式は、JSON列のJSONデータに関する特定の問題を識別するのに役立ちます。この章で使用しているサンプル・データでは、JSONPersons.addressフィールドが提供される場合と、そうでない場合があります。住所が存在する場合、郵便番号が含まれている場合と、そうでない場合があります。検索case式を使用して、各行に関する特定の問題を識別して記述できます。

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 

2番目の検索case式を使用する3番目の列を追加して、レポートを改善できます。

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 

最後に、検索case式をネストできます。このサンプル・データには、phones配列に偽のnullも含まれています(id 4を参照)。これを次のようにレポートできます(出力はスペースに収まるように少し変更されています)。

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