SQLiteでは、json_each()
は、最初の引数として提供されたJSON値をウォークし、配列要素またはオブジェクトメンバーごとに1行で構成されるテーブルを返すテーブル値関数です。
オプションで、開始するパスを指定する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つのリンゴ料理、アップルパイとアップルジュースを注文したためです。