sql >> Databasteknik >  >> RDS >> SQLite

3 sätt att extrahera ett värde från ett JSON-dokument i SQLite

När vi använder SQLite kan vi använda följande metoder för att extrahera data från ett JSON-dokument.

json_extract() Funktion

Som namnet antyder, json_extract() funktion extraherar och returnerar ett eller flera värden från välformad JSON.

Exempel:

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

Resultat:

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

Matriser är nollbaserade, så räkningen börjar vid 0 . Därför angav vi [1] för att få det andra elementet inom hundar array, som råkar vara ett JSON-objekt.

Vi kan bara returnera namnet på hunden på den positionen i arrayen genom att lägga till i vår sökväg:

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

Resultat:

Bark

Vi kan använda json_extract() för att returnera flera sökvägar:

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

Resultat:

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

När vi extraherar värden från flera sökvägar, returneras värdena i en array.

-> Operatör

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

Därför kan vi ändra det första exemplet till detta:

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

Resultat:

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

-> operatorn skiljer sig subtilt från json_extract() funktion:

  • -> operatorn returnerar alltid en JSON-representation av underkomponenten.
  • json_extract() Funktionen returnerar endast JSON om det finns två eller flera sökvägsargument (eftersom resultatet då är en JSON-matris) eller om det enkla sökvägsargumentet refererar till en matris eller ett objekt.
  • Om det bara finns ett sökvägsargument och den sökvägen refererar till en JSON-null eller en sträng eller ett numeriskt värde, då json_extract() returnerar motsvarande SQL NULL-, TEXT-, INTEGER- eller REAL-värde.

Därför är det här vad som händer när vi extraherar en hunds namn från vår JSON:

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

Resultat:

"Bark"

Den här gången är den omgiven av citat. Det beror på att det returnerade en JSON-representation av värdet. När vi extraherade samma värde med json_extract() tidigare fick vi en SQL-representation av värdet.

Men vi kan också använda ->> operatorn för att returnera en SQL-representation.

->> Operatör

->> operatorn fungerar på samma sätt som -> operator, förutom att ->> returnerar en SQL-representation av den angivna underkomponenten. Specifikt returnerar den en SQL-TEXT , INTEGER , REAL , eller NULL värde som representerar den valda underkomponenten, eller NULL om underkomponenten inte finns.

Därför är det här vad som händer när vi använder ->> operatör för att extrahera hundens namn:

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

Resultat:

Bark

Det står inte längre inom citattecken.


  1. OracleDataSource vs. Oracle UCP PoolDataSource

  2. Distribuera PostgreSQL på en Docker Container

  3. Jämföra datalager för PostgreSQL - MVCC vs InnoDB

  4. Fördelarna med PostgreSQL