MariaDBでは、JSON_VALUE()
関数とJSON_QUERY()
関数は同様のことを行います–JSONドキュメントからデータを返します。
では、違いは何ですか?
主な違いは、JSON_VALUE()
スカラー値を返しますが、JSON_QUERY()
配列とオブジェクトを返します。
定義
JSONドキュメントが与えられると、各関数は次のことを行います。
-
JSON_VALUE()
パスで指定されたスカラーを返します。 -
JSON_QUERY()
パスで指定されたオブジェクトまたは配列を返します。
私の理解では、SQL標準により、このように機能します。
これにより問題が発生する場合は、JSON_EXTRACT()
が見つかる可能性があります。 より便利な機能。
スカラー
これは、両方の関数を使用してJSONドキュメントからスカラーを抽出しようとするとどうなるかを示す例です。
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;
結果:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
期待どおりにスカラーを返しましたが、JSON_QUERY()
返されたNULL
。 JSON_QUERY()
であるため、これは予想されることです。 配列とオブジェクトのみを返します。
配列からスカラーデータを返そうとしても同じ結果になります:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;
結果:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
オブジェクト
両方の関数を使用してオブジェクト全体を返そうとすると、次のようになります。
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
結果:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+>
今回はJSON_QUERY()
成功する関数。
配列
両方の関数を使用して配列全体を返そうとすると、次のようになります。
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;
結果:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
繰り返しますが、JSON_QUERY()
関数は成功します。
ただし、配列ワイルドカード演算子を使用して配列からすべてのスカラー要素を選択すると、どちらの関数も成功しません。この場合、JSON_EXTRACT()
救助に来る:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;
結果:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
ただし、配列の要素が配列またはオブジェクトの場合、JSON_QUERY()
それらを正常に返します:
SET @json_document = '
{
"name" : "Rufus",
"scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ]
}
';
SELECT
JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;
結果:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+