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内の個々の値にアクセスする場合にのみ明らかになります。