sql >> Database >  >> RDS >> SQLite

Operator

In SQLite is de ->> operator extraheert een subcomponent uit een JSON-document en retourneert een SQL-representatie van die subcomponent.

De ->> operator werd voor het eerst geïntroduceerd in SQLite versie 3.38.0 (uitgebracht op 22 februari 2022).

Syntaxis

De syntaxis gaat als volgt:

json ->> path

Waar json is het JSON-document en path is het pad naar de subcomponent die we eruit willen halen.

We bieden dus een JSON-document aan de linkerkant van de operator, en we specificeren het pad dat we rechts ervan willen extraheren.

De ->> operator retourneert altijd een SQL-representatie van de opgegeven subcomponent. Gebruik de -> . om een ​​JSON-representatie te retourneren operator in plaats daarvan.

Voorbeelden

Hier is een eenvoudig voorbeeld om te demonstreren hoe de ->> operator werkt:

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

Resultaat:

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

In dit geval heb ik een pad gespecificeerd van '$' die het hele document retourneert.

Laten we een ander pad specificeren:

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

Resultaat:

Dog

We kunnen het dollarteken en de punt ook helemaal weglaten, zoals dit:

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

Resultaat:

Dog

Hier is het met een groter JSON-document:

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

Resultaat:

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

In SQLite zijn arrays gebaseerd op nul en specificeren ze dus [0] geeft het eerste array-element terug.

Als we alleen de scores van die gebruiker wilden hebben, zouden we dit kunnen doen:

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

Resultaat:

[9,7,3]

We kunnen nog dieper gaan en een specifieke score extraheren:

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

Resultaat:

7

Niet-bestaand pad

Als het pad niet bestaat in de JSON, wordt een null-waarde geretourneerd:

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

Resultaat:

null

Merk op dat u in SQLite .nullvalue . kunt gebruiken om een ​​tekenreeks op te geven die moet worden uitgevoerd wanneer een null-waarde wordt geretourneerd. In mijn geval had ik eerder het volgende commando uitgevoerd:

.nullvalue null

Dat specificeert dat de tekst null moet worden uitgevoerd wanneer een null-waarde wordt geretourneerd. Daarom geeft het bovenstaande voorbeeld de tekst null . weer . Als ik dit niet had gedaan, was het resultaat mogelijk leeg geweest.

Ongeldige JSON

Als het eerste argument geen geldige JSON is, wordt er een fout gegenereerd:

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

Resultaat:

Runtime error: malformed JSON

Ongeldig pad

En als het tweede argument geen geldig pad is, wordt er een fout gegenereerd:

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

Resultaat:

Runtime error: JSON path error near 'name'

In dit geval ben ik vergeten de punt toe te voegen (. ) tussen het dollarteken ($ ) en name .

Zoals vermeld, is het echter mogelijk om het dollarteken en de punt helemaal weg te laten:

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

Resultaat:

Wag

  1. Hoe installeer ik SQLcl op een Mac

  2. Spring Boot Query-annotatie met nativeQuery werkt niet in Postgresql

  3. controleer of het een getalfunctie is in Oracle

  4. De grootte van tabellen bepalen in Oracle