sql >> Databáze >  >> RDS >> SQLite

Operátor

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

  1. MariaDB ROW_COUNT() Vysvětleno

  2. Jak vytvořit připojení k Postgres přes Node.js

  3. Naučte se základní analýzu dat s funkcemi okna SQL

  4. Vylepšená podpora pro paralelní statistické přestavby