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

MariaDB JSON_VALUE()とJSON_QUERY():違いは何ですか?

    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() 返されたNULLJSON_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 } ] |
    +------------+------------------------------------+

    1. Oracleで2列のデータをA、B形式で取得する方法

    2. 大きなテーブルでのSQLServerクエリのパフォーマンスを向上させる

    3. パブリックネットワーク上でサイバー攻撃からMySQLとMariaDBデータベースを保護する方法

    4. 64ビットアプリケーションをAcombaに接続する