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

SQLite JSON_EXTRACT()

    SQLiteでは、json_extract() 関数は、整形式のJSONから1つ以上の値を抽出して返します。

    関数を呼び出すときに引数としてJSONを渡し、該当する値を返します。

    JSONドキュメントから抽出する1つ以上のパスを指定できます。

    構文

    構文は次のようになります:

    json_extract(X,P1,P2,...)

    ここでX JSONドキュメントを表し、P1,P2,... JSONドキュメントの特定の部分を抽出するために使用できるパスです。

    実例となる基本的な例は次のとおりです。

    SELECT json_extract('{ "a" : 1 }', '$');

    結果:

    {"a":1}

    ここでは、$のパスを指定しました 、JSONドキュメント全体を返します。

    より大きなJSONドキュメントの例を次に示します。

    SELECT json_extract('{
        "dogs" : [
                { "name" : "Wag", "scores" : [ 7, 9 ] },
                { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
                { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
        ]
    }', 
    '$'
    );

    結果:

    {"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}

    dogsだけを返すようにパスを変更しましょう 配列:

    SELECT json_extract('{
        "dogs" : [
                { "name" : "Wag", "scores" : [ 7, 9 ] },
                { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
                { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
        ]
    }', 
    '$.dogs'
    );

    結果:

    [{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]

    配列内の要素の1つを選択しましょう:

    SELECT json_extract('{
        "dogs" : [
                { "name" : "Wag", "scores" : [ 7, 9 ] },
                { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
                { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
        ]
    }', 
    '$.dogs[1]'
    );

    結果:

    {"name":"Bark","scores":[3,4,8,7]}

    配列はゼロベースであるため、カウントは0から始まります。 。したがって、[1]を指定しました dogs内の2番目の要素を取得します 配列。これはたまたまJSONオブジェクトです。

    もう一度深く掘り下げて、配列内のその位置にある犬の名前だけを返しましょう。

    SELECT json_extract('{
        "dogs" : [
                { "name" : "Wag", "scores" : [ 7, 9 ] },
                { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
                { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
        ]
    }', 
    '$.dogs[1].name'
    );

    結果:

    Bark

    複数のパスを指定する

    json_extract() 関数を使用すると、複数のパスを選択できます:

    SELECT json_extract('{
        "dogs" : [
                { "name" : "Wag", "scores" : [ 7, 9 ] },
                { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
                { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
        ]
    }', 
    '$.dogs[0].name',
    '$.dogs[1].name',
    '$.dogs[2].name'
    );

    結果:

    ["Wag","Bark","Woof"]

    この場合、dogs内のすべての犬の名前を返しました。 配列。

    すべての犬の名前が配列で返されます。

    存在しないパスの選択

    存在しないパスを指す場合、null 返されます。

    まず、.nullvalueを設定しましょう NULLへ :

    .nullvalue NULL

    .nullvalue dotコマンドを使用すると、null値を置き換えるために使用される文字列を提供できます。これは、SQLiteでnull値を文字列に置き換えることができるいくつかの方法の1つです。この場合、NULLに設定しました 。これで、null値はNULLを返します。 空白の結果の代わりに。

    それでは、json_extract()を呼び出しましょう。 、ただし、存在しないパスを指す2番目の引数を使用します:

    SELECT json_extract('{
        "dogs" : [
                { "name" : "Wag", "scores" : [ 7, 9 ] },
                { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
                { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
        ]
    }', 
    '$.cats'
    );

    結果:

    NULL

    無効なパス

    パスが整形式でない場合はエラーが発生します:

    SELECT json_extract('{
        "dogs" : [
                { "name" : "Wag", "scores" : [ 7, 9 ] },
                { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
                { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
        ]
    }', 
    'dogs'
    );

    結果:

    Runtime error: JSON path error near 'dogs'

    この場合、$. パスの前にあります。

    無効なJSONドキュメント

    また、JSONの形式が正しくないというエラーも表示されます:

    SELECT json_extract('{ "Dogs" : }', 
    '$'
    );

    結果:

    Runtime error: malformed JSON

    今回のエラーは、JSONの形式が正しくないことを示しています。

    返品タイプ

    SQLiteのドキュメントには次のように記載されています:

    パスP1が1つだけ指定されている場合、結果のSQLデータ型はJSON nullの場合はNULL、JSON数値の場合はINTEGERまたはREAL、JSON false値の場合はINTEGERゼロ、JSONtrue値の場合はINTEGER1です。 JSON文字列値の引用符で囲まれたテキスト、およびJSONオブジェクトと配列値のテキスト表現。複数のパス引数(P1、P2など)がある場合、このルーチンは、さまざまな値を保持する整形式のJSON配列であるSQLiteテキストを返します。

    MySQLの互換性

    SQLiteのドキュメントでは、json_extract()のSQLiteとMySQLの実装間の微妙な非互換性についても警告しています。 機能。

    具体的には、次のように述べています。

    MySQLバージョンのjson_extract()は常にJSONを返します。 SQLiteバージョンのjson_extract()は、2つ以上のPATH引数がある場合(結果がJSON配列であるため)、または単一のPATH引数が配列またはオブジェクトを参照する場合にのみJSONを返します。 SQLiteでは、json_extract()にPATH引数が1つしかなく、そのPATHがJSON null、文字列、または数値を参照している場合、json_extract()は対応するSQL NULL、TEXT、INTEGER、またはREAL値を返します。

    基本的に、この違いは、文字列またはNULLであるJSON内の個々の値にアクセスする場合にのみ明らかになります。


    1. WHERE句の列名エイリアスを参照してください

    2. データベースセキュリティ101:オープンソースデータベースのセキュリティ

    3. T-SQLを使用してSQLServerの外部キーの名前を変更する

    4. MySQLでのクロス/外部適用