sql >> Database >  >> RDS >> SQLite

SQLite JSON_ARRAY_LENGTH()

In SQLite is de json_array_length() functie retourneert het aantal elementen in een gegeven JSON-array.

De array wordt geleverd als argument. Als de array is ingesloten in een groter JSON-document, kunnen we een optioneel tweede argument gebruiken om het pad naar de array op te geven.

Als de waarde geen array is, retourneert de functie 0 .

Syntaxis

De functie kan op de volgende twee manieren worden gebruikt:

json_array_length(X)
json_array_length(X,P)

Waar X staat voor de array en P is een optioneel pad dat kan worden gebruikt om het pad naar de array in een groter document te specificeren.

Voorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren:

SELECT json_array_length('[ 7, 12, 10 ]');

Resultaat:

3

De array bevat drie elementen en dus 3 wordt geretourneerd.

Geef een pad op

We kunnen ook een tweede argument gebruiken om het pad naar de array te specificeren:

SELECT json_array_length('[ 7, 12, 10 ]', '$');

Resultaat:

3

In dit geval bevindt de array zich op het hoogste niveau, en dus passeren we $ als het pad.

In het volgende voorbeeld wordt een array gebruikt die is ingesloten in een groter document:

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

Resultaat:

3

In dit geval is de array op dogs bevat drie elementen.

We kunnen naar het volgende niveau navigeren en het aantal elementen in een van de andere arrays vinden:

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

Resultaat:

4

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 gebruiken dan .scores om zijn array te selecteren.

Niet-arrays selecteren

Als het pad naar een andere waarde dan een JSON-array verwijst, 0 wordt geretourneerd:

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

Resultaat:

0

Een niet-bestaand pad selecteren

Als het tweede argument verwijst 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_array_length() . aanroepen , maar gebruik een tweede argument dat verwijst naar een niet-bestaand pad:

SELECT json_array_length('{
    "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_array_length('{
    "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_array_length('{ "Dogs" : }', 
'$'
);

Resultaat:

Runtime error: malformed JSON

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


  1. Kunnen we threading gebruiken in PL/SQL?

  2. PHP PDO:charset, setnamen?

  3. Invoegen in... Samenvoegen... Selecteer (SQL Server)

  4. Een INSERT Pass-Through-query uitvoeren in SQL Server