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

SQLite JSON_EACH()

    SQLiteでは、json_each() は、最初の引数として提供されたJSON値をウォークし、配列要素またはオブジェクトメンバーごとに1行で構成されるテーブルを返すテーブル値関数です。

    関数を呼び出すときに引数としてJSON値を提供します。

    オプションで、開始するパスを指定する2番目の引数を渡すことができます。これを行うとき、json_each() そのパスを最上位の要素として扱います。

    json_each() 関数は、最上位の配列またはオブジェクトの直接の子のみをウォークします。最上位の要素がプリミティブ値の場合は、最上位の要素自体のみをウォークします。 JSON部分構造を再帰的にウォークスルーするには、json_tree()を使用します 代わりに。

    構文 この関数は次のように使用できます。

    json_each(X)
    json_each(X,P)

    Xの場所 JSONを表し、P は、トップレベルとして扱うパスを表すオプションの引数です。

    これがどのように機能するかを示す例です。

    SELECT * FROM json_each('{ "name" : "Woof", "age" : 10 }');

    結果:

    +------+-------+---------+------+----+--------+---------+------+
    | key  | value |  type   | atom | id | parent | fullkey | path |
    +------+-------+---------+------+----+--------+---------+------+
    | name | Woof  | text    | Woof | 2  | null   | $.name  | $    |
    | age  | 10    | integer | 10   | 4  | null   | $.age   | $    |
    +------+-------+---------+------+----+--------+---------+------+

    各オブジェクトメンバーには、タイプ(SQLテキスト値)やパスなどの有用な情報を含む独自の行があることがわかります。

    idについて 列、SQLiteのドキュメントによると、これは内部のハウスキーピング番号であり、その計算は将来のリリースで変更される可能性があります。唯一の保証は、id 列は行ごとに異なります。

    親列は常にnullです json_each()を呼び出すとき 。この列は、json_tree()を使用するとより意味のあるものになります 。

    配列

    この例では、JSON値は配列です:

    SELECT * FROM json_each('[ 10, 30, 45 ]');

    結果:

    +-----+-------+---------+------+----+--------+---------+------+
    | key | value |  type   | atom | id | parent | fullkey | path |
    +-----+-------+---------+------+----+--------+---------+------+
    | 0   | 10    | integer | 10   | 1  | null   | $[0]    | $    |
    | 1   | 30    | integer | 30   | 2  | null   | $[1]    | $    |
    | 2   | 45    | integer | 45   | 3  | null   | $[2]    | $    |
    +-----+-------+---------+------+----+--------+---------+------+

    パスを指定

    2番目の引数を使用して、トップレベルとして扱うパスを指定できます。

    例:

    SELECT * FROM json_each('{ "a" : 1, "b" : [ 4, 7, 8 ] }', '$.b');

    結果:

    +-----+-------+---------+------+----+--------+---------+------+
    | key | value |  type   | atom | id | parent | fullkey | path |
    +-----+-------+---------+------+----+--------+---------+------+
    | 0   | 4     | integer | 4    | 5  | null   | $.b[0]  | $.b  |
    | 1   | 7     | integer | 7    | 6  | null   | $.b[1]  | $.b  |
    | 2   | 8     | integer | 8    | 7  | null   | $.b[2]  | $.b  |
    +-----+-------+---------+------+----+--------+---------+------+

    より大きなドキュメント

    この例では、より大きなJSONドキュメントを使用します。まず、json_each()を呼び出しましょう パスを指定せずに:

    SELECT * FROM json_each('[
            { 
            "user" : "Spike",
            "age" : 30,
            "scores" : [ 9, 7, 3 ]
            },
            { 
            "user" : "Faye",
            "age" : 25,
            "scores" : [ 90, 87, 93 ]
            },
            { 
            "user" : "Jet",
            "age" : 40,
            "scores" : [ 50, 38, 67 ]
            }
            ]'
        );

    結果:

    +-----+----------------------------------------------+--------+------+----+--------+---------+------+
    | key |                    value                     |  type  | atom | id | parent | fullkey | path |
    +-----+----------------------------------------------+--------+------+----+--------+---------+------+
    | 0   | {"user":"Spike","age":30,"scores":[9,7,3]}   | object | N/A  | 1  | N/A    | $[0]    | $    |
    | 1   | {"user":"Faye","age":25,"scores":[90,87,93]} | object | N/A  | 11 | N/A    | $[1]    | $    |
    | 2   | {"user":"Jet","age":40,"scores":[50,38,67]}  | object | N/A  | 21 | N/A    | $[2]    | $    |
    +-----+----------------------------------------------+--------+------+----+--------+---------+------+

    この場合、JSON値は3つのオブジェクトを含む配列です。各オブジェクトが結果に一覧表示されます。

    それでは、json_each()を呼び出しましょう 繰り返しますが、今回はパスを指定します:

    SELECT * FROM json_each('[
            { 
            "user" : "Spike",
            "age" : 30,
            "scores" : [ 9, 7, 3 ]
            },
            { 
            "user" : "Faye",
            "age" : 25,
            "scores" : [ 90, 87, 93 ]
            },
            { 
            "user" : "Jet",
            "age" : 40,
            "scores" : [ 50, 38, 67 ]
            }
            ]',
            '$[1]'
        );

    結果:

    +--------+------------+---------+------+----+--------+-------------+------+
    |  key   |   value    |  type   | atom | id | parent |   fullkey   | path |
    +--------+------------+---------+------+----+--------+-------------+------+
    | user   | Faye       | text    | Faye | 13 | null   | $[1].user   | $[1] |
    | age    | 25         | integer | 25   | 15 | null   | $[1].age    | $[1] |
    | scores | [90,87,93] | array   | null | 17 | null   | $[1].scores | $[1] |
    +--------+------------+---------+------+----+--------+-------------+------+

    この場合、[1]を指定して2番目の配列要素を選択しました (配列はSQLiteに基づいてゼロです。)

    その結果、出力には2番目の配列要素に関する情報が含まれます。

    今回は、path 列に$[1]が含まれています 。

    もっと深く見ていきましょう:

    SELECT * FROM json_each('[
            { 
            "user" : "Spike",
            "age" : 30,
            "scores" : [ 9, 7, 3 ]
            },
            { 
            "user" : "Faye",
            "age" : 25,
            "scores" : [ 90, 87, 93 ]
            },
            { 
            "user" : "Jet",
            "age" : 40,
            "scores" : [ 50, 38, 67 ]
            }
            ]',
            '$[1].scores'
        );

    結果:

    +-----+-------+---------+------+----+--------+----------------+-------------+
    | key | value |  type   | atom | id | parent |    fullkey     |    path     |
    +-----+-------+---------+------+----+--------+----------------+-------------+
    | 0   | 90    | integer | 90   | 18 | null   | $[1].scores[0] | $[1].scores |
    | 1   | 87    | integer | 87   | 19 | null   | $[1].scores[1] | $[1].scores |
    | 2   | 93    | integer | 93   | 20 | null   | $[1].scores[2] | $[1].scores |
    +-----+-------+---------+------+----+--------+----------------+-------------+

    これで、scoresの各要素の行が取得されます。 配列。

    クエリのフィルタリング

    クエリを変更して、特定の基準に基づいて結果をフィルタリングできます。例:

    SELECT 
        fullkey, 
        value 
    FROM json_each('[
            { 
            "user" : "Spike",
            "age" : 30,
            "scores" : [ 9, 7, 3 ]
            },
            { 
            "user" : "Faye",
            "age" : 25,
            "scores" : [ 90, 87, 93 ]
            },
            { 
            "user" : "Jet",
            "age" : 40,
            "scores" : [ 50, 38, 67 ]
            }
            ]'
        )
    WHERE json_each.value LIKE '%Faye%';

    結果:

    +---------+----------------------------------------------+
    | fullkey |                    value                     |
    +---------+----------------------------------------------+
    | $[1]    | {"user":"Faye","age":25,"scores":[90,87,93]} |
    +---------+----------------------------------------------+

    データベースの例

    次の表があるとします。

    SELECT * FROM guests;

    結果:

    +-------+--------------------------------------------------+
    | guest |                      lunch                       |
    +-------+--------------------------------------------------+
    | Zohan | ["Beef Pie", "Fruit Salad", "Apple Juice"]       |
    | Amy   | ["Vegetable Quiche", "Apple", "Fruit Juice"]     |
    | Rohit | ["Beef Curry", "Dragonfruit", "Vegetable Juice"] |
    | Igor  | ["Chicken Pie", "Jackfruit", "Fruit Juice"]      |
    | Stacy | ["Chicken Curry", "Fruit Salad", "Apple Juice"]  |
    | Aisha | ["Chicken Curry", "Apple Pie", "Apple Juice"]    |
    +-------+--------------------------------------------------+

    このテーブルはguestsと呼ばれます 2つの列があります。最初の列にはゲストの名前が含まれ、2番目の列にはゲストの昼食の注文が含まれます。彼らは昼食のために3つの料理を注文することができます。彼らの昼食の注文は配列の形式であり、各料理は配列の要素です。

    json_each()を組み込んだクエリを実行する例を次に示します。 このテーブルに対して:

    SELECT DISTINCT
        guest,
        lunch
    FROM 
        guests, 
        json_each(lunch)
    WHERE json_each.value LIKE 'Apple Juice';

    結果:

    +-------+-------------------------------------------------+
    | guest |                      lunch                      |
    +-------+-------------------------------------------------+
    | Zohan | ["Beef Pie", "Fruit Salad", "Apple Juice"]      |
    | Stacy | ["Chicken Curry", "Fruit Salad", "Apple Juice"] |
    | Aisha | ["Chicken Curry", "Apple Pie", "Apple Juice"]   |
    +-------+-------------------------------------------------+

    ここでは、リンゴジュースを注文したすべてのゲストと、完全な昼食の注文を返しました。

    アップルを「何か」注文したすべてのゲストを返品したい場合は、次のようにします。

    SELECT DISTINCT
        guest,
        lunch
    FROM 
        guests, 
        json_each(lunch)
    WHERE json_each.value LIKE 'Apple%';

    結果:

    +-------+-------------------------------------------------+
    | guest |                      lunch                      |
    +-------+-------------------------------------------------+
    | Zohan | ["Beef Pie", "Fruit Salad", "Apple Juice"]      |
    | Amy   | ["Vegetable Quiche", "Apple", "Fruit Juice"]    |
    | Stacy | ["Chicken Curry", "Fruit Salad", "Apple Juice"] |
    | Aisha | ["Chicken Curry", "Apple Pie", "Apple Juice"]   |
    +-------+-------------------------------------------------+

    DISTINCTを使用したことに注意してください 私のクエリの句。これにより、同じゲストに対して複数の行が返されることがなくなります。私が何を意味するかを示すために、ここにもう一度クエリがありますが、DISTINCTはありません 条項:

    SELECT
        guest,
        lunch
    FROM 
        guests, 
        json_each(lunch)
    WHERE json_each.value LIKE 'Apple%';

    結果:

    +-------+-------------------------------------------------+
    | guest |                      lunch                      |
    +-------+-------------------------------------------------+
    | Zohan | ["Beef Pie", "Fruit Salad", "Apple Juice"]      |
    | Amy   | ["Vegetable Quiche", "Apple", "Fruit Juice"]    |
    | Stacy | ["Chicken Curry", "Fruit Salad", "Apple Juice"] |
    | Aisha | ["Chicken Curry", "Apple Pie", "Apple Juice"]   |
    | Aisha | ["Chicken Curry", "Apple Pie", "Apple Juice"]   |
    +-------+-------------------------------------------------+

    今回はアイシャが2回登場。それは、彼女が昼食に2つのリンゴ料理、アップルパイとアップルジュースを注文したためです。


    1. スポットライトクラウドアラームの収集時間

    2. SQLServerロックエスカレーション

    3. MySQLの基本的なデータベース管理コマンド–パートI

    4. OracleはNumberデータ型の末尾のゼロを格納しますか?