SQLiteでは、->>
オペレーターはJSONドキュメントからサブコンポーネントを抽出し、そのサブコンポーネントのSQL表現を返します。
->>コード> 演算子は、SQLiteバージョン3.38.0(2022年2月22日にリリース)で最初に導入されました。
構文
構文は次のようになります:
json ->> path
json
JSONドキュメントとpath
抽出するサブコンポーネントへのパスです。
そのため、オペレーターの左側にJSONドキュメントを提供し、その右側に抽出するパスを指定します。
->>コード> 演算子は常に、指定されたサブコンポーネントのSQL表現を返します。 JSON表現を返すには、
->
を使用します 代わりに演算子。
例
->>
の簡単な例を次に示します。 演算子は機能します:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';
結果:
{"name":"Wag","type":"Dog"}
この場合、'$'
のパスを指定しました ドキュメント全体を返します。
別のパスを指定しましょう:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
結果:
Dog
次のように、ドル記号とピリオドを完全に省略することもできます。
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';
結果:
Dog
これは、より大きなJSONドキュメントです:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0]';
結果:
{"user":"Spike","age":30,"scores":[9,7,3]}
SQLiteでは、配列はゼロベースであるため、 [0]
を指定します 最初の配列要素を返します。
そのユーザーのスコアのみを取得したい場合は、次のようにすることができます:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores';
結果:
[9,7,3]
さらに深く掘り下げて、特定のスコアを抽出することができます:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores[1]';
結果:
7
存在しないパス
パスがJSONに存在しない場合は、null値が返されます:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';
結果:
null
SQLiteでは、 .nullvalue
を使用できることに注意してください null値が返されるたびに出力する文字列を指定します。私の場合、以前に次のコマンドを実行していました:
.nullvalue null
これは、テキスト null
を指定します null値が返されるたびに出力する必要があります。そのため、上記の例では null
というテキストが出力されます。 。これを行わなかった場合、結果は空白になっている可能性があります。
無効なJSON
最初の引数が有効なJSONでない場合、エラーがスローされます:
SELECT '{ "name" }' ->> '$';
結果:
Runtime error: malformed JSON
無効なパス
また、2番目の引数が有効なパスでない場合は、エラーがスローされます。
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';
結果:
Runtime error: JSON path error near 'name'
この場合、終止符(。
)を含めるのを忘れました。 )ドル記号の間( $
)および name
。
ただし、前述のように、ドル記号を省略してピリオドを完全に停止することは可能です。
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';
結果:
Wag