В 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