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

Est-ce que le tableau est composé de tous les NULL dans PostgreSQL

1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL

1 et 2 peut être tout deux nombres distincts.

Alternatives et performances

Il existe de nombreuses façons. J'ai assemblé un cas de test rapide :

SELECT arr::text
     , -1 = ALL(arr) IS NULL                              AS xsimple
     , 1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL      AS simple
     , array_remove(arr, NULL) = '{}'                     AS array_rem
     , cardinality(array_positions(arr, NULL))
     = cardinality(arr)                                   AS array_pos
     , TRUE = ALL (SELECT unnest(arr) IS NULL)            AS michael
     , (SELECT bool_and(e IS NULL) FROM unnest(arr) e)    AS bool_and
     , NOT EXISTS (SELECT unnest(arr) EXCEPT SELECT null) AS exist
FROM  (
   VALUES
     ('{1,2,NULL,3}'::int[])
   , ('{1,1,1}')
   , ('{2,2,2}')
   , ('{NULL,NULL,NULL}')
   , ('{}'::int[])
   ) t(arr);

       arr        | xsimple | simple | array_rem | array_pos | michael | bool_and | exist 
------------------+---------+--------+-----------+-----------+---------+----------+-------
 {1,2,NULL,3}     | f       | f      | f         | f         | f       | f        | f
 {1,1,1}          | f       | f      | f         | f         | f       | f        | f
 {2,2,2}          | f       | f      | f         | f         | f       | f        | f
 {NULL,NULL,NULL} | t       | t      | t         | t         | t       | t        | t
 {}               | f       | f      | t         | t         | t       |          | t

array_remove() nécessite Postgres 9.3 ou version ultérieure.
array_positions() nécessite Postgres 9.5 ou version ultérieure.

chk_michael est de la réponse actuellement acceptée par @michael .
Les colonnes sont dans l'ordre de performance de l'expression. Le plus rapide en premier.
Mes vérifications simples dominent les performances, avec array_remove() Suivant. Le reste ne peut pas suivre.

Le tableau vide de cas particulier ({} ) demande de l'attention. Définissez le résultat attendu et choisissez une expression appropriée ou ajoutez une vérification supplémentaire.

db<>violon ici - avec test de performance
Ancien sqlfiddle

Comment ça marche ?

L'expression 1 = ALL(arr) donne :

TRUE .. si tous les éléments sont 1
FALSE .. si un élément est <> 1 (tout élément qui IS NOT NULL )
NULL .. si au moins un élément IS NULL et aucun élément n'est <> 1

Donc, si nous connaissons un seul élément qui ne peut pas apparaître (forcé par un CHECK contrainte), comme -1 , nous pouvons simplifier :

-1 = ALL(arr) IS NULL

Si tout numéro peut apparaître, vérifiez s'il y a deux numéros distincts. Le résultat ne peut être que NULL pour les deux si le tableau ne contient que NULL . Voilà.