->コード> および->> 演算子は、2022年2月22日にリリースされたSQLiteバージョン3.38.0で導入されました。両方の演算子は、JSONのサブコンポーネントを抽出するために使用されます。しかし、それらの間には微妙な違いがあります。
違い
これらの演算子の違いは次のようになります:
->コード> 演算子は常にJSONを返します 指定されたサブコンポーネントの表現->>コード> 演算子は常にSQLを返します 指定されたサブコンポーネントの表現
例
これら2つの演算子の違いを示す例を次に示します。
SELECT
'{ "name" : "Wag", "type" : "Dog" }' -> '$.type' AS "->",
'{ "name" : "Wag", "type" : "Dog" }' ->> '$.type' AS "->>"; 結果:
+-------+-----+ | -> | ->> | +-------+-----+ | "Dog" | Dog | +-------+-----+
->であることがわかります ->> に対して、二重引用符で囲まれた値を返しました しませんでした。
-> 値のJSON表現を返し、->> SQL表現を返しました。
数字
数字を使用する例を次に示します。
SELECT
'{ "age" : 10 }' -> '$.age' AS "->",
'{ "age" : 10 }' ->> '$.age' AS "->>"; 結果:
+----+-----+ | -> | ->> | +----+-----+ | 10 | 10 | +----+-----+
typeof()を使用すると次のようになります SQLタイプを取得する関数:
SELECT
typeof('{ "age" : 10 }' -> '$.age') AS "->",
typeof('{ "age" : 10 }' ->> '$.age') AS "->>"; 結果:
+------+---------+ | -> | ->> | +------+---------+ | text | integer | +------+---------+
ただし、 json_type()を使用する場合 、JSONタイプを取得します:
SELECT
json_type('{ "age" : 10 }' -> '$.age') AS "->",
json_type('{ "age" : 10 }' ->> '$.age') AS "->>"; 結果:
+---------+---------+ | -> | ->> | +---------+---------+ | integer | integer | +---------+---------+
実数を使用する例を次に示します。
SELECT
typeof('{ "age" : 1.2 }' -> '$.age') AS "->",
typeof('{ "age" : 1.2 }' ->> '$.age') AS "->>"; 結果:
+------+------+ | -> | ->> | +------+------+ | text | real | +------+------+
そしてjson_type() :
SELECT
json_type('{ "age" : 1.2 }' -> '$.age') AS "->",
json_type('{ "age" : 1.2 }' ->> '$.age') AS "->>"; 結果:
+------+------+ | -> | ->> | +------+------+ | real | real | +------+------+
ヌル値
JSONドキュメントにnullが含まれている場合 、次に-> nullのJSON表現を返し、->> 単にnull値を返します。
これが私の意味を示す例です:
SELECT
'{ "name" : "Wag", "type" : null }' -> '$.type' AS "->",
'{ "name" : "Wag", "type" : null }' ->> '$.type' AS "->>"; 結果:
+------+-----+ | -> | ->> | +------+-----+ | null | | +------+-----+
デフォルトでは、SQLiteコマンドラインインターフェイス(CLI)は、null値が返されるたびに空の文字列を返します。したがって、この例から、-> ->> に対して、実際のJSON値はnullを返しました 実際のnull値を返しました。
これをさらに実証するために、 .nullvalueを設定できます。 空の文字列以外に:
.nullvalue n/a 次に、前のクエリをもう一度実行してみましょう:
SELECT
'{ "name" : "Wag", "type" : null }' -> '$.type' AS "->",
'{ "name" : "Wag", "type" : null }' ->> '$.type' AS "->>"; 結果:
+------+-----+ | -> | ->> | +------+-----+ | null | n/a | +------+-----+
今回はn/ a ->>に対して出力されました 空の文字列の代わりに演算子。
そして、出力を typeof()に渡すとどうなりますか。 およびjson_type() 機能:
SELECT
typeof('{ "name" : "Wag", "type" : null }' -> '$.type') AS "->",
typeof('{ "name" : "Wag", "type" : null }' ->> '$.type') AS "->>";
SELECT
json_type('{ "name" : "Wag", "type" : null }' -> '$.type') AS "->",
json_type('{ "name" : "Wag", "type" : null }' ->> '$.type') AS "->>"; 結果:
+------+------+ | -> | ->> | +------+------+ | text | null | +------+------+ +------+-----+ | -> | ->> | +------+-----+ | null | n/a | +------+-----+
代替: json_extract()
SQLiteでJSONドキュメントから値を抽出する別の方法は、 json_extract()を使用することです。 働き。この関数は、->とは少し異なります。 および->> 戻り値のタイプはコンテキストによって異なります。
json_extract() 関数は、2つ以上のパス引数がある場合(結果がJSON配列であるため)、または単一のパス引数が配列またはオブジェクトを参照する場合にのみJSONを返します。
パス引数が1つだけで、そのパスがJSON null、文字列、または数値を参照している場合は、 json_extract() 対応するSQLNULL、TEXT、INTEGER、またはREAL値を返します。