Когато използваме SQLite, можем да използваме следните методи за извличане на данни от JSON документ.
json_extract() Функция
Както подсказва името му, json_extract() функцията извлича и връща една или повече стойности от добре оформен JSON.
Пример:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
); Резултат:
{"name":"Bark","scores":[3,4,8,7]}
Масивите са базирани на нула и така броят започва от 0 . Затова посочихме [1] за да получите втория елемент в dogs масив, който се оказва JSON обект.
Можем да върнем само името на кучето на тази позиция в масива, като добавим към нашия път:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].name'
); Резултат:
Bark
Можем да използваме json_extract() за връщане на няколко пътя:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
); Резултат:
["Wag","Bark","Woof"]
Когато извличаме стойности от множество пътища, стойностите се връщат в масив.
-> Оператор
-> оператор извлича подкомпонент от JSON документ и връща JSON представяне на този подкомпонент.
Следователно можем да променим първия пример на този:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]'; Резултат:
{"name":"Bark","scores":[3,4,8,7]}
-> операторът е малко различен от json_extract() функция:
->операторът винаги връща JSON представяне на подкомпонента.json_extract()функцията връща JSON само ако има два или повече аргумента на пътя (тъй като резултатът е JSON масив) или ако единичният аргумент за път препраща към масив или обект.- Ако има само един аргумент за път и този път препраща към JSON нула, низ или числова стойност, тогава
json_extract()връща съответната SQL стойност NULL, TEXT, INTEGER или REAL.
Ето защо, ето какво се случва, когато извлечем името на куче от нашия JSON:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name'; Резултат:
"Bark"
Този път е заобиколен от кавички. Това е така, защото връща JSON представяне на стойността. Когато извлечехме същата стойност с json_extract() преди това получихме SQL представяне на стойността.
Можем обаче да използваме и ->> оператор за връщане на SQL представяне.
->> Оператор
->> операторът работи по същия начин като -> оператор, с изключение на ->> връща SQL представяне на посочения подкомпонент. По-конкретно, той връща SQL TEXT , INTEGER , REAL или NULL стойност, която представлява избрания подкомпонент, или NULL ако подкомпонентът не съществува.
Ето защо, ето какво се случва, когато използваме ->> оператор за извличане на името на кучето:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name'; Резултат:
Bark
Вече не е затворено в кавички.