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