-> и ->> Операторите бяха въведени в 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.