sql >> Database >  >> RDS >> SQLite

SQLite JSON_EXTRACT()

In SQLite, de json_extract() functie extraheert en retourneert een of meer waarden uit goed gevormde JSON.

We geven de JSON door als een argument wanneer we de functie aanroepen, en het retourneert de toepasselijke waarde/s.

We kunnen een of meer paden specificeren om uit het JSON-document te extraheren.

Syntaxis

De syntaxis gaat als volgt:

json_extract(X,P1,P2,...)

Waar X staat voor het JSON-document, en P1,P2,... zijn paden die we kunnen gebruiken om specifieke delen van het JSON-document te extraheren.

Voorbeelden

Hier is een eenvoudig voorbeeld om te demonstreren:

SELECT json_extract('{ "a" : 1 }', '$');

Resultaat:

{"a":1}

Hier heb ik een pad gespecificeerd van $ , die het hele JSON-document retourneert.

Hier is een voorbeeld met een groter JSON-document:

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

Resultaat:

{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}

Laten we het pad veranderen zodat we alleen de dogs . teruggeven reeks:

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

Resultaat:

[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]

Laten we een van de elementen in de array selecteren:

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.

Laten we weer dieper gaan en alleen de naam van de hond op die positie in de array retourneren:

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

Specificeer meerdere paden

De json_extract() functie stelt ons in staat om meerdere paden te selecteren:

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"]

In dit geval heb ik de namen geretourneerd van alle honden in de dogs array.

Alle hondennamen worden geretourneerd in een array.

Een niet-bestaand pad selecteren

Als we verwijzen naar een pad dat niet bestaat, null wordt geretourneerd.

Laten we eerst .nullvalue . instellen naar NULL :

.nullvalue NULL

De .nullvalue dot-opdracht stelt ons in staat om een ​​tekenreeks op te geven die zal worden gebruikt om null-waarden te vervangen. Het is een van de vele manieren waarop u null-waarden kunt vervangen door een tekenreeks in SQLite. In dit geval heb ik het ingesteld op NULL . Nu, alle null-waarden retourneren NULL in plaats van een leeg resultaat.

Laten we nu json_extract() . aanroepen , maar gebruik een tweede argument dat verwijst naar een niet-bestaand pad:

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

Resultaat:

NULL

Ongeldige paden

We krijgen een foutmelding als ons pad niet goed is gevormd:

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

Resultaat:

Runtime error: JSON path error near 'dogs'

In dit geval ben ik vergeten $. aan de voorkant van het pad.

Ongeldige JSON-documenten

We krijgen ook een foutmelding dat de JSON niet goed is gevormd:

SELECT json_extract('{ "Dogs" : }', 
'$'
);

Resultaat:

Runtime error: malformed JSON

Deze keer vertelt de fout ons dat onze JSON een verkeerde indeling heeft.

Retourtypes

In de SQLite-documentatie staat het volgende:

Als er slechts één pad P1 is opgegeven, is het SQL-gegevenstype van het resultaat NULL voor een JSON null, INTEGER of REAL voor een JSON-numerieke waarde, een INTEGER nul voor een JSON false-waarde, een INTEGER één voor een JSON true-waarde, de tekst tussen aanhalingstekens voor een JSON-tekenreekswaarde en een tekstrepresentatie voor JSON-object- en matrixwaarden. Als er meerdere padargumenten zijn (P1, P2, enzovoort), retourneert deze routine SQLite-tekst, een goed gevormde JSON-array die de verschillende waarden bevat.

MySQL-compatibiliteit

De SQLite-documentatie waarschuwt ons ook voor een subtiele incompatibiliteit tussen de SQLite- en MySQL-implementaties van de json_extract() functie.

Er staat specifiek:

De MySQL-versie van json_extract() retourneert altijd JSON. De SQLite-versie van json_extract() retourneert alleen JSON als er twee of meer PATH-argumenten zijn (omdat het resultaat dan een JSON-array is) of als het enkele PATH-argument verwijst naar een array of object. Als json_extract() in SQLite slechts één PATH-argument heeft en dat PATH verwijst naar een JSON-null of een tekenreeks of een numerieke waarde, dan retourneert json_extract() de bijbehorende SQL-waarde NULL, TEXT, INTEGER of REAL.

In principe wordt dit verschil pas duidelijk bij toegang tot individuele waarden binnen de JSON die strings of NULL's zijn.


  1. Geen enkele vorm van databasecaching om dubbele databasequery's te verminderen.

  2. Bereken lopend totaal / lopend saldo

  3. Gegevens invoegen in een MySQL-database

  4. Het dubbele aanhalingsteken weglaten om een ​​query uit te voeren op PostgreSQL