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à.