sql >> Databasteknik >  >> RDS >> SQLite

Operatör

I SQLite, ->> operatorn extraherar en underkomponent från ett JSON-dokument och returnerar en SQL-representation av den underkomponenten.

->> operatorn introducerades först i SQLite version 3.38.0 (släpptes den 22 februari 2022).

Syntax

Syntaxen ser ut så här:

json ->> path

Där json är JSON-dokumentet och sökvägen är sökvägen till underkomponenten som vi vill extrahera från den.

Så vi tillhandahåller ett JSON-dokument till vänster om operatören, och vi anger sökvägen vi vill extrahera till höger om den.

->> operatorn returnerar alltid en SQL-representation av den angivna underkomponenten. För att returnera en JSON-representation, använd -> operatör istället.

Exempel

Här är ett enkelt exempel för att visa hur ->> operatören fungerar:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';

Resultat:

{"name":"Wag","type":"Dog"}

I det här fallet angav jag sökvägen '$' som returnerar hela dokumentet.

Låt oss ange en annan sökväg:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';

Resultat:

Dog

Vi kan också utelämna dollartecknet och punkten helt, så här:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';

Resultat:

Dog

Här är det med ett större JSON-dokument:

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]';

Resultat:

{"user":"Spike","age":30,"scores":[9,7,3]}

I SQLite är arrayer nollbaserade och specificerar därför [0] returnerar det första arrayelementet.

Om vi ​​bara ville få den användarens poäng kunde vi göra så här:

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';

Resultat:

[9,7,3]

Vi kan gå ännu djupare och extrahera en specifik poäng:

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]';

Resultat:

7

Icke-existerande sökväg

Om sökvägen inte finns i JSON returneras ett nullvärde:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';

Resultat:

null

Observera att i SQLite kan du använda .nullvalue för att ange en sträng som ska matas ut när ett nollvärde returneras. I mitt fall hade jag tidigare kört följande kommando:

.nullvalue null

Det anger att texten null ska matas ut när ett nollvärde returneras. Det är därför exemplet ovan matar ut texten null . Om jag inte hade gjort det här kan resultatet ha varit tomt.

Ogiltig JSON

Om det första argumentet inte är giltigt JSON, visas ett felmeddelande:

SELECT '{ "name" }' ->> '$';

Resultat:

Runtime error: malformed JSON

Ogiltig sökväg

Och om det andra argumentet inte är en giltig sökväg, skapas ett fel:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';

Resultat:

Runtime error: JSON path error near 'name'

I det här fallet glömde jag att inkludera punkten (. ) mellan dollartecknet ($ ) och namn .

Men som nämnt är det möjligt att utelämna dollartecknet och punkten helt och hållet:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';

Resultat:

Wag

  1. Dumpa en mysql-databas till en klartext (CSV) säkerhetskopia från kommandoraden

  2. Hur tar man bort från flera tabeller i MySQL?

  3. Oracle 12c-installationen kunde inte komma åt den tillfälliga platsen

  4. Migrera från Postgres till SQL Server 2008