SQLite
 sql >> Base de données >  >> RDS >> SQLite

SQLite JSON_ARRAY_LENGTH()

Dans SQLite, le json_array_length() La fonction renvoie le nombre d'éléments dans un tableau JSON donné.

Le tableau est fourni en argument. Si le tableau est intégré dans un document JSON plus volumineux, nous pouvons utiliser un deuxième argument facultatif pour spécifier le chemin d'accès au tableau.

Si la valeur n'est pas un tableau, la fonction renvoie 0 .

Syntaxe

La fonction peut être utilisée des deux manières suivantes :

json_array_length(X)
json_array_length(X,P)

X représente le tableau et P est un chemin facultatif qui peut être utilisé pour spécifier le chemin d'accès au tableau dans un document plus volumineux.

Exemple

Voici un exemple de base pour illustrer :

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

Résultat :

3

Le tableau contient trois éléments et donc 3 est renvoyé.

Spécifier un chemin

On peut aussi utiliser un deuxième argument afin de spécifier le chemin vers le tableau :

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

Résultat :

3

Dans ce cas, le tableau est au niveau supérieur, et nous passons donc $ comme chemin.

L'exemple suivant utilise un tableau intégré dans un document plus volumineux :

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

Résultat :

3

Dans ce cas, le tableau à dogs contient trois éléments.

Nous pouvons naviguer jusqu'au niveau suivant et trouver le nombre d'éléments dans l'un des autres tableaux :

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

Résultat :

4

Les tableaux sont basés sur zéro, et donc le décompte commence à 0 . Par conséquent, nous avons spécifié [1] pour obtenir le deuxième élément dans le dogs tableau, qui se trouve être un objet JSON. Nous utilisons ensuite .scores pour sélectionner son tableau.

Sélectionner des non-tableaux

Si le chemin pointe vers une valeur autre qu'un tableau JSON, 0 est renvoyé :

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

Résultat :

0

Sélectionner un chemin inexistant

Si le deuxième argument pointe vers un chemin qui n'existe pas, null est renvoyé.

Tout d'abord, définissons .nullvalue à NULL :

.nullvalue NULL

Le .nullvalue La commande point nous permet de fournir une chaîne qui sera utilisée pour remplacer les valeurs nulles. C'est l'une des nombreuses façons dont vous pouvez remplacer les valeurs nulles par une chaîne dans SQLite. Dans ce cas, je l'ai défini sur NULL . Désormais, toutes les valeurs nulles renverront NULL au lieu d'un résultat vide.

Appelons maintenant json_array_length() , mais utilisez un deuxième argument qui pointe vers un chemin inexistant :

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

Résultat :

NULL

Chemins non valides

Nous aurons une erreur si notre chemin n'est pas bien formé :

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

Résultat :

Runtime error: JSON path error near 'dogs'

Dans ce cas, j'ai oublié d'inclure $. au début du chemin.

Documents JSON non valides

Nous aurons également une erreur, le JSON n'est pas bien formé :

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

Résultat :

Runtime error: malformed JSON

Cette fois, l'erreur nous indique que notre JSON est malformé.