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

JSONPathワイルドカードステップ(**)がMariaDBでどのように機能するか

    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番目の要素を指します アレイ。


    1. SQLite AUTOINCREMENT

    2. SQL自己結合

    3. 結合更新のMySQL構文

    4. オブジェクト[INFORMATION_SCHEMA]。[TABLES]への未解決の参照