->
и ->>
Операторите бяха въведени в SQLite версия 3.38.0, която беше пусната на 22 февруари 2022 г. И двата оператора се използват за извличане на подкомпоненти на JSON. Но има фина разлика между тях.
Разликата
Разликата между тези оператори е следната:
->
операторът винаги връща JSON представяне на посочения подкомпонент->>
операторът винаги връща SQL представяне на посочения подкомпонент
Пример
Ето пример, който илюстрира разликата между тези два оператора:
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
, след това ->код> ще върне JSON представянето на null и
->>
просто ще върне нулева стойност.
Ето пример, за да демонстрирам какво имам предвид:
SELECT
'{ "name" : "Wag", "type" : null }' -> '$.type' AS "->",
'{ "name" : "Wag", "type" : null }' ->> '$.type' AS "->>";
Резултат:
+------+-----+ | -> | ->> | +------+-----+ | null | | +------+-----+
По подразбиране интерфейсът на командния ред на SQLite (CLI) връща празния низ всеки път, когато се върне нулева стойност. Така че можем да видим от нашия пример, че ->
върна действителната стойност на JSON 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()
Друг начин за извличане на стойности от JSON документ в SQLite е да използвате json_extract()
функция. Тази функция работи малко по-различно от ->
и ->>
в това, че типът на връщане зависи от контекста.
json_extract()
функцията връща JSON само ако има два или повече аргумента на пътя (тъй като резултатът е JSON масив) или ако единичният аргумент за път препраща към масив или обект.
Ако има само един аргумент за път и този път препраща към JSON нула, низ или числова стойност, тогава json_extract()
връща съответната SQL стойност NULL, TEXT, INTEGER или REAL.