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

SQLite JSON_EXTRACT()

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.


  1. Je nějaký rozdíl mezi IS NULL a =NULL

  2. Převeďte Unixové časové razítko na hodnotu data v Oracle

  3. INSERT INTO ... RETURNING - nejednoznačný odkaz na sloupec

  4. Strana Vztah Vzor. Jak modelovat vztahy