Когато използваме 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
Вече не е затворено в кавички.