В SQLite, ->> оператор извлича подкомпонент от JSON документ и връща SQL представяне на този подкомпонент.
->> Операторът беше въведен за първи път в SQLite версия 3.38.0 (издадена на 22 февруари 2022 г.).
Синтаксис
Синтаксисът е така:
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, се връща нулева стойност:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age'; Резултат:
null
Имайте предвид, че в SQLite можете да използвате .nullvalue за да посочите низ за извеждане всеки път, когато се върне нулева стойност. В моя случай преди това изпълних следната команда:
.nullvalue null
Това указва, че текстът null трябва да се извежда всеки път, когато се върне нулева стойност. Ето защо горният пример извежда текста null . Ако не бях направил това, резултатът можеше да е празен.
Невалиден JSON
Ако първият аргумент не е валиден JSON, се извежда грешка:
SELECT '{ "name" }' ->> '$'; Резултат:
Runtime error: malformed JSON
Невалиден път
И ако вторият аргумент не е валиден път, се извежда грешка:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name'; Резултат:
Runtime error: JSON path error near 'name'
В този случай забравих да включа точката (. ) между знака за долар ($ ) и name .
Въпреки това, както споменахме, възможно е да пропуснете знака за долар и точката напълно:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name'; Резултат:
Wag