sql >> Database >  >> RDS >> SQLite

3 manieren om een ​​waarde uit een JSON-document in SQLite te extraheren

Wanneer we SQLite gebruiken, kunnen we de volgende methoden gebruiken om gegevens uit een JSON-document te extraheren.

De json_extract() Functie

Zoals de naam al doet vermoeden, is de json_extract() functie extraheert en retourneert een of meer waarden uit goed gevormde JSON.

Voorbeeld:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Resultaat:

{"name":"Bark","scores":[3,4,8,7]}

Arrays zijn gebaseerd op nul, en dus begint de telling bij 0 . Daarom hebben we [1] . gespecificeerd om het tweede element binnen de dogs te krijgen array, wat toevallig een JSON-object is.

We kunnen alleen de naam van de hond op die positie in de array retourneren door aan ons pad toe te voegen:

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

Resultaat:

Bark

We kunnen json_extract() . gebruiken om meerdere paden terug te geven:

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

Resultaat:

["Wag","Bark","Woof"]

Wanneer we waarden uit meerdere paden extraheren, worden de waarden geretourneerd in een array.

De -> Operator

De -> operator extraheert een subcomponent uit een JSON-document en retourneert een JSON-representatie van die subcomponent.

Daarom kunnen we het eerste voorbeeld hierin veranderen:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1]';

Resultaat:

{"name":"Bark","scores":[3,4,8,7]}

De -> operator is subtiel anders dan de json_extract() functie:

  • De -> operator retourneert altijd een JSON-representatie van het subonderdeel.
  • De json_extract() functie retourneert alleen JSON als er twee of meer padargumenten zijn (omdat het resultaat dan een JSON-array is) of als het enkele padargument verwijst naar een array of object.
  • Als er maar één padargument is en dat pad verwijst naar een JSON-null of een tekenreeks of een numerieke waarde, dan json_extract() geeft de corresponderende SQL NULL, TEXT, INTEGER of REAL waarde terug.

Daarom is dit wat er gebeurt als we de naam van een hond uit onze JSON halen:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1].name';

Resultaat:

"Bark"

Deze keer is het omgeven door aanhalingstekens. Dat komt omdat het een JSON-representatie van de waarde heeft geretourneerd. Toen we dezelfde waarde extraheren met json_extract() eerder kregen we een SQL-representatie van de waarde.

We kunnen echter ook de ->> . gebruiken operator om een ​​SQL-representatie te retourneren.

De ->> Operator

De ->> operator werkt op dezelfde manier als de -> operator, behalve dat ->> retourneert een SQL-representatie van de opgegeven subcomponent. In het bijzonder retourneert het een SQL TEXT , INTEGER , REAL , of NULL waarde die de geselecteerde subcomponent vertegenwoordigt, of NULL als de subcomponent niet bestaat.

Daarom is dit wat er gebeurt als we de ->> . gebruiken operator om de naam van de hond te extraheren:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' ->> '$.dogs[1].name';

Resultaat:

Bark

Het staat niet langer tussen aanhalingstekens.


  1. Fout 28000:Inloggen mislukt voor gebruiker DOMAIN\\gebruiker met pyodbc

  2. Hoe een Rest API te bouwen met Spring Boot met behulp van MySQL en JPA

  3. MySQL AUTO_INCREMENT wordt niet ROLLBACK

  4. Prestaties en serviceniveaus van Azure SQL Database uitgelegd