MariaDBでJSONを操作する場合、JSONPath式を使用してJSONドキュメント内のデータを操作できます。
MariaDBが提供する強力な機能の1つは、ワイルドカードステップ(**
)。これにより、現在の要素のすべての子要素を再帰的に選択できます。
ワイルドカードステップは非標準の拡張機能であり、MySQLでも同じ意味でサポートされています。
例
デモンストレーションの例を次に示します。
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
結果:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
ワイルドカードステップはすべてのオブジェクトを調べ、それらのname
から値を選択しました メンバー。
この場合、別のセレクターで同じ結果を達成できたはずです。配列ワイルドカードセレクターは、同じ結果を得るのに役立ちます:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
結果:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
同じ結果。
ただし、別のドキュメントを使用すると状況が変わります。
例2
次の例では、ワイルドカードステップと配列セレクターの間で異なる結果が得られます。
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
結果:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
別の結果。
結果は明らかにドキュメントとJSONPath式の実際の構成に依存し、使用されるセレクターは要件によって異なります。
覚えておくべきことの1つは、ワイルドカードステップがJSONPath式の最後のステップであってはならないということです。その後に、配列またはオブジェクトメンバーのセレクターステップを実行する必要があります。
例3
これは、sizes
と呼ばれるすべての配列から2番目の配列要素を返す例です。 、他のドキュメント内にネストされている配列を含む:
SET @json = '[
{
"_id": 1,
"product": {
"name" : "Tuxedo",
"color" : "Blue",
"sizes": [ "S", "M", "L" ],
"accessories" : {
"belt" : {
"color" : "Navy",
"sizes" : [ "Wide", "Narrow" ]
},
"tie" : {
"color" : "Black",
"sizes" : [ "Short", "Medium", "Long" ]
}
}
}
}
]';
SELECT JSON_EXTRACT(@json, '$**.sizes[1]');
結果:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
配列はゼロベースであるため、$**.sizes[1]
すべてのsizes
の2番目の要素を指します アレイ。