sql >> データベース >  >> RDS >> MariaDB

MariaDB JSON_TABLE()の説明

    MariaDBでは、 JSON_TABLE() JSONデータをリレーショナル形式に変換する組み込み関数です。

    つまり、JSONドキュメントをテーブルとして返すことができます。

    JSON_TABLE() 関数はMariaDB10.6.0で導入されました。

    構文

    構文は次のようになります:

    JSON_TABLE(json_doc, 
              context_path COLUMNS (column_list)
    ) [AS] alias

    column_listの場所 このようになります:

    column[, column][, ...]

    columnの場所 このようになります:

    name FOR ORDINALITY
        |  name type PATH value_path path [on_empty] [on_error]
        |  name type EXISTS PATH value_path
        |  NESTED [PATH] path COLUMNS (column_list)

    on_emptyの場所 このようになります:

    {NULL | DEFAULT string | ERROR} ON EMPTY

    そしてon_error このようになります:

    {NULL | DEFAULT string | ERROR} ON ERROR

    実例を示します。

    SET @json_document = '
    [
        { "name": "Wag", "type": "Dog", "weight": 20 },
        { "name": "Bark", "type": "Dog", "weight": 10 },
        { "name": "Meow", "type": "Cat", "weight": 7 }
    ]
    ';
    
    SELECT * FROM JSON_TABLE(@json_document, '$[*]'
        COLUMNS (
        name VARCHAR(255) PATH '$.name', 
        type VARCHAR(50) PATH '$.type',
        weight INT PATH '$.weight' 
        )
    ) AS json_table;

    結果:

    +------+------+--------+
    | name | type | weight |
    +------+------+--------+
    | Wag  | Dog  |     20 |
    | Bark | Dog  |     10 |
    | Meow | Cat  |      7 |
    +------+------+--------+

    ここでは、テーブルの各列に名前を付け、そのデータ型を指定してから、その列に適用されるJSONドキュメントからのパスを指定します。

    そのため、最初の列を nameと呼びました。 、次に nameというノードをマッピングしました JSONドキュメントからその列へ。

    通常の列

    FOR ORDINALITY オプションを使用して、 1から始まる行をカウントできます。 。

    SET @json_document = '
    [
        { "name": "Scratch", "type": "Cat", "weight": 8 },
        { "name": "Bruce", "type": "Kangaroo", "weight": 100 },
        { "name": "Hop", "type": "Kangaroo", "weight": 130 }
    ]
    ';
    SELECT * FROM JSON_TABLE(@json_document, '$[*]'
        COLUMNS (
        id FOR ORDINALITY,
        name VARCHAR(255) PATH '$.name', 
        type VARCHAR(50) PATH '$.type',
        weight INT PATH '$.weight' 
        )
    ) AS json_table;

    結果:

    +------+---------+----------+--------+
    | id   | name    | type     | weight |
    +------+---------+----------+--------+
    |    1 | Scratch | Cat      |      8 |
    |    2 | Bruce   | Kangaroo |    100 |
    |    3 | Hop     | Kangaroo |    130 |
    +------+---------+----------+--------+

    パスの存在を確認する

    EXISTSを使用できます パスの存在を確認する句。パスがJSONドキュメントに存在する場合、結果は 1になります。 。存在しない場合は、 0 返されます。

    SET @json_document = '
    [
        { "name": "Punch", "type": "Kangaroo", "weight": 200 },
        { "name": "Snap", "type": "Cat", "weight": 12 },
        { "name": "Ruff", "type": "Dog" }
    ]
    ';
    SELECT * FROM JSON_TABLE(@json_document, '$[*]'
        COLUMNS (
        name  VARCHAR(255) PATH '$.name', 
        type VARCHAR(50) PATH '$.type',
        has_weight INT EXISTS PATH '$.weight' 
        )
    ) AS json_table;

    結果:

    +-------+----------+------------+
    | name  | type     | has_weight |
    +-------+----------+------------+
    | Punch | Kangaroo |          1 |
    | Snap  | Cat      |          1 |
    | Ruff  | Dog      |          0 |
    +-------+----------+------------+

    ネストされたパス

    NESTED PATH 句を使用すると、ネストされたJSONドキュメントを処理できます。この句を使用すると、ネストされたJSON構造が複数の行に変換されます。

    例:

    SET @json_document = '
    [
        { "product": "Left Handed Screwdriver", "sizes": [ "S", "M", "L" ] },
        { "product": "Long Weight", "sizes": [ "S", "L", "XL" ] },
        { "product": "Bottomless Coffee Cup" }
    ]
    ';
    SELECT * FROM JSON_TABLE(@json_document, '$[*]'
        COLUMNS (
        product  VARCHAR(255) PATH '$.product', 
        NESTED PATH '$.sizes[*]' columns (
            size VARCHAR(2) PATH '$'
            )
        )
    ) AS json_table;

    結果:

    +-------------------------+------+
    | product                 | size |
    +-------------------------+------+
    | Left Handed Screwdriver | S    |
    | Left Handed Screwdriver | M    |
    | Left Handed Screwdriver | L    |
    | Long Weight             | S    |
    | Long Weight             | L    |
    | Long Weight             | XL   |
    | Bottomless Coffee Cup   | NULL |
    +-------------------------+------+

    空のパスの処理

    ON EMPTY 句は、検索パスで指定された要素がJSONドキュメントにない場合に何が行われるかを指定します。

    例:

    SET @json_document = '
    [
        { "name": "Punch", "type": "Kangaroo", "weight": 200 },
        { "name": "Snap", "type": "Cat", "weight": 12 },
        { "name": "Ruff"}
    ]
    ';
    SELECT * FROM JSON_TABLE(@json_document, '$[*]'
        COLUMNS (
        name  VARCHAR(255) PATH '$.name', 
        type VARCHAR(50) PATH '$.type' DEFAULT "N/A" ON EMPTY,
        weight INT PATH '$.weight'
        )
    ) AS json_table;

    結果:

    +-------+----------+--------+
    | name  | type     | weight |
    +-------+----------+--------+
    | Punch | Kangaroo |    200 |
    | Snap  | Cat      |     12 |
    | Ruff  | N/A      |   NULL |
    +-------+----------+--------+

    この例では、 Ruff タイプフィールドがないため、 N / A が返されます。これは、 ON EMPTYで指定したためです。 そのフィールドの句。

    エラーへの対処

    ON ERROR 句は、ドキュメントから値を抽出しようとしたときにJSON構造エラーが発生した場合に何をすべきかを指定します。

    JSON構造体エラーは、JSON非スカラー(配列またはオブジェクト)をスカラー値に変換しようとした場合にのみ発生します。 ON ERROR 句が存在しない、 NULL ON ERROR 暗示されます。

    JSON構造エラーの処理例を次に示します。

    SET @json_document = '
    [
        { "product": "Left Handed Screwdriver", "sizes": [ "S", "M", "L" ] },
        { "product": "Long Weight", "sizes": [ "S", "L", "XL" ] },
        { "product": "Bottomless Coffee Cup" }
    ]
    ';
    SELECT * FROM JSON_TABLE(@json_document, '$[*]'
        COLUMNS (
        product  VARCHAR(255) PATH '$.product', 
        sizes VARCHAR(5) PATH '$.sizes' 
            DEFAULT 'Oops!' ON ERROR
            DEFAULT 'None' ON EMPTY
        )
    ) AS json_table;

    結果:

    +-------------------------+-------+
    | product                 | sizes |
    +-------------------------+-------+
    | Left Handed Screwdriver | Oops! |
    | Long Weight             | Oops! |
    | Bottomless Coffee Cup   | None  |
    +-------------------------+-------+

    ここでは、文字列を指定しました(おっと! )JSON構造エラーが発生したときに使用します。

    この場合、 ON EMPTYも含めました 句。これは、両方の ON ERROR およびONEMPTY 句は同じステートメントで使用できます。

    ただし、データ型変換エラー(たとえば、非整数値を整数フィールドに格納しようとしたり、varchar列が切り捨てられたりする)はJSONエラーとは見なされないため、エラー時 句。代わりに、警告が表示されます。

    これが私が何を意味するかを説明するための例です:

    SET @json_document = '
    [
        { "name": "Punch", "type": "Kangaroo" },
        { "name": "Snap", "type": "Cat" },
        { "name": "Ruff", "type": "Dog" }
    ]
    ';
    SELECT * FROM JSON_TABLE(@json_document, '$[*]'
        COLUMNS (
        name  VARCHAR(255) PATH '$.name', 
        type INT PATH '$.type' DEFAULT 'Oops!' ON ERROR
        )
    ) AS json_table;

    結果:

    +-------+------+
    | name  | type |
    +-------+------+
    | Punch |    0 |
    | Snap  |    0 |
    | Ruff  |    0 |
    +-------+------+
    3 rows in set, 3 warnings (0.000 sec)

    警告を表示しましょう:

    SHOW WARNINGS;

    結果:

    +---------+------+---------------------------------------------------------------------------------+
    | Level   | Code | Message                                                                         |
    +---------+------+---------------------------------------------------------------------------------+
    | Warning | 1366 | Incorrect integer value: 'Kangaroo' for column ``.`(temporary)`.`type` at row 1 |
    | Warning | 1366 | Incorrect integer value: 'Cat' for column ``.`(temporary)`.`type` at row 2      |
    | Warning | 1366 | Incorrect integer value: 'Dog' for column ``.`(temporary)`.`type` at row 3      |
    +---------+------+---------------------------------------------------------------------------------+

    1. Androidコンテンツプロバイダーに見つからないコンテンツプロバイダーのURLを修正するにはどうすればよいですか?

    2. Postgresのパスワード認証が失敗する

    3. MySQLタイムゾーン

    4. SQL Serverなしで.mdfデータベースにアクセスすることは可能ですか?