V SQLite, ->> operátor extrahuje dílčí komponentu z dokumentu JSON a vrací reprezentaci SQL této dílčí komponenty.
->> operátor byl poprvé představen ve verzi SQLite 3.38.0 (vydáno 22. února 2022).
Syntaxe
Syntaxe vypadá takto:
json ->> path
Kde json je dokument JSON a path je cesta k podsložce, kterou z ní chceme extrahovat.
Nalevo od operátoru tedy poskytneme dokument JSON a napravo od něj určíme cestu, kterou chceme extrahovat.
->> operátor vždy vrací reprezentaci SQL zadané dílčí komponenty. Chcete-li vrátit reprezentaci JSON, použijte -> místo toho.
Příklady
Zde je jednoduchý příklad, který ukazuje, jak ->> operátor funguje:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$'; Výsledek:
{"name":"Wag","type":"Dog"}
V tomto případě jsem zadal cestu '$' který vrátí celý dokument.
Uvedeme jinou cestu:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type'; Výsledek:
Dog
Znak dolaru a tečku můžeme také úplně vynechat, například takto:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type'; Výsledek:
Dog
Tady je to s větším dokumentem 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]'; Výsledek:
{"user":"Spike","age":30,"scores":[9,7,3]}
V SQLite jsou pole založena na nule, a tak určují [0] vrátí první prvek pole.
Pokud bychom chtěli získat pouze skóre tohoto uživatele, mohli bychom udělat toto:
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'; Výsledek:
[9,7,3]
Můžeme jít ještě hlouběji a extrahovat konkrétní skóre:
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]'; Výsledek:
7
Neexistující cesta
Pokud cesta v JSON neexistuje, vrátí se hodnota null:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age'; Výsledek:
null
Všimněte si, že v SQLite můžete použít .nullvalue k určení řetězce, který se má vypsat vždy, když je vrácena hodnota null. V mém případě jsem předtím spustil následující příkaz:
.nullvalue null
To určuje, že text null by měl být výstup vždy, když je vrácena hodnota null. To je důvod, proč výše uvedený příklad zobrazuje text null . Kdybych to neudělal, výsledek by mohl být prázdný.
Neplatný JSON
Pokud první argument není platný JSON, je vyvolána chyba:
SELECT '{ "name" }' ->> '$'; Výsledek:
Runtime error: malformed JSON
Neplatná cesta
A pokud druhý argument není platná cesta, je vyvolána chyba:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name'; Výsledek:
Runtime error: JSON path error near 'name'
V tomto případě jsem zapomněl uvést tečku (. ) mezi znak dolaru ($ ) a name .
Nicméně, jak již bylo zmíněno, je možné vynechat znak dolaru a tečku úplně:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name'; Výsledek:
Wag