web-dev-qa-db-fra.com

Quel est le moyen le plus rapide de vérifier qu'un tableau json [] n'est pas vide?

Je veux vérifier qu'une colonne json[]the_array N'est pas vide. Pour un tableau normal, je pourrais vérifier:

the_array != '{}'

Cependant, cela ne fonctionne pas pour un json[], Comme illustré ci-dessous:

select '{}'::json[] != '{}'
ERROR:  could not identify an equality operator for type json

Je pourrais utiliser la vérification suivante à la place:

array_length(the_array, 1) != null // yes, array_length on an
                                      empty array returns null

Ma crainte est que array_length() itère sur tout le tableau pour compter le nombre d'éléments, puis renvoie ce nombre. Dans mon cas, je n'ai pas besoin de la taille réelle du tableau, j'ai juste besoin de savoir s'il est vide ou non.

Alors, array_length() itère-t-il sur tout le tableau? Et si oui, existe-t-il une meilleure façon de vérifier si un tableau json est vide?

3
Jarius Hebzo

Cela ne renvoie pas un tableau JSON.

SELECT '{}'::json[]

Le type json[] N'est pas un "tableau JSON", c'est un tableau SQL de type JSON. Vous ne devriez jamais utiliser ce type de structure. C'est presque certainement un drapeau rouge de mauvaise conception.

Ce que vous voulez vérifier, c'est qu'un vrai tableau JSON n'est pas vide, vous pouvez le faire avec jsonb_array_length(jsonb) . JSON est stocké sous la forme JSON ou JSONB pour json binaire.

SELECT jsonb_array_length( '[]'::jsonb );

Pour voir s'il est vide,

SELECT jsonb_array_length( '[]'::jsonb ) = 0;

Attention, cela ne compte que ces éléments, ils peuvent être nuls ,

SELECT jsonb_array_length( '[null]'::jsonb );

Donc, vous voudrez peut-être appeler jsonb_strip_nulls() sur le tableau en premier.

4
Evan Carroll