V SQLite, json_extract()
funkce extrahuje a vrátí jednu nebo více hodnot ze správně vytvořeného JSON.
Při volání funkce předáme JSON jako argument a vrátí použitelnou hodnotu/y.
Můžeme zadat jednu nebo více cest k extrahování z dokumentu JSON.
Syntaxe
Syntaxe vypadá takto:
json_extract(X,P1,P2,...)
Kde X
představuje dokument JSON a P1,P2,...
jsou cesty, které můžeme použít k extrahování konkrétních částí dokumentu JSON.
Příklady
Zde je základní příklad k demonstraci:
SELECT json_extract('{ "a" : 1 }', '$');
Výsledek:
{"a":1}
Zde jsem zadal cestu $
, který vrátí celý dokument JSON.
Zde je příklad s větším dokumentem JSON:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$'
);
Výsledek:
{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}
Změňme cestu tak, abychom vraceli pouze dogs
pole:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs'
);
Výsledek:
[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]
Vyberme jeden z prvků v poli:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Výsledek:
{"name":"Bark","scores":[3,4,8,7]}
Pole jsou založeny na nule, takže počet začíná na 0
. Proto jsme zadali [1]
získat druhý prvek v rámci dogs
pole, což je shodou okolností objekt JSON.
Pojďme znovu hlouběji a vrátíme pouze jméno psa na dané pozici v poli:
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'
);
Výsledek:
Bark
Zadejte více cest
json_extract()
funkce nám umožňuje vybrat více cest:
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'
);
Výsledek:
["Wag","Bark","Woof"]
V tomto případě jsem vrátil jména všech psů v dogs
pole.
Všechna jména psů jsou vrácena v poli.
Výběr neexistující cesty
Pokud ukážeme na cestu, která neexistuje, null
je vráceno.
Nejprve nastavíme .nullvalue
na NULL
:
.nullvalue NULL
.nullvalue
Příkaz dot nám umožňuje zadat řetězec, který bude použit k nahrazení hodnot null. Je to jeden z několika způsobů, jak můžete nahradit hodnoty null řetězcem v SQLite. V tomto případě jsem jej nastavil na NULL
. Nyní všechny hodnoty null vrátí NULL
místo prázdného výsledku.
Nyní zavoláme json_extract()
, ale použijte druhý argument, který ukazuje na neexistující cestu:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.cats'
);
Výsledek:
NULL
Neplatné cesty
Pokud naše cesta není správně vytvořena, zobrazí se chyba:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'dogs'
);
Výsledek:
Runtime error: JSON path error near 'dogs'
V tomto případě jsem zapomněl uvést $.
v přední části cesty.
Neplatné dokumenty JSON
Také se zobrazí chyba, že JSON není správně vytvořen:
SELECT json_extract('{ "Dogs" : }',
'$'
);
Výsledek:
Runtime error: malformed JSON
Tentokrát nám chyba říká, že náš JSON je chybný.
Typy vrácení
Dokumentace SQLite uvádí následující:
Pokud je zadána pouze jedna cesta P1, pak je datový typ SQL výsledku NULL pro hodnotu JSON null, INTEGER nebo REAL pro číselnou hodnotu JSON, INTEGER nula pro nepravdivou hodnotu JSON, INTEGER jedna pro hodnotu JSON true, decitovaný text pro hodnotu řetězce JSON a textovou reprezentaci pro hodnoty objektu a pole JSON. Pokud existuje více argumentů cesty (P1, P2 atd.), pak tato rutina vrátí text SQLite, což je dobře vytvořené pole JSON obsahující různé hodnoty.
Kompatibilita s MySQL
Dokumentace SQLite nás také varuje před drobnou nekompatibilitou mezi implementacemi SQLite a MySQL funkce json_extract()
funkce.
Konkrétně uvádí:
MySQL verze json_extract() vždy vrací JSON. Verze SQLite json_extract() vrací JSON pouze v případě, že existují dva nebo více argumentů PATH (protože výsledkem je pak pole JSON) nebo pokud jediný argument PATH odkazuje na pole nebo objekt. Pokud má json_extract() v SQLite pouze jeden argument PATH a tato PATH odkazuje na JSON null nebo řetězec nebo číselnou hodnotu, pak json_extract() vrátí odpovídající hodnotu SQL NULL, TEXT, INTEGER nebo REAL.
V zásadě se tento rozdíl projeví pouze při přístupu k jednotlivým hodnotám v rámci JSON, které jsou řetězce nebo hodnoty NULL.