1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
och 2
kan vara vilken som helst två distinkta nummer.
Alternativ och prestanda
Det finns många sätt. Jag satte ihop ett snabbt testfall:
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()
kräver Postgres 9.3 eller senare.array_positions()
kräver Postgres 9.5 eller senare.
chk_michael
är från det för närvarande accepterade svaret av @michael
.
Kolumnerna är i ordning efter uttryckets prestanda. Snabbast först.
Mina enkla kontroller dominerar prestanda, med array_remove()
Nästa. Resten kan inte hänga med.
Den tomma matrisen för specialfall ({}
) kräver uppmärksamhet. Definiera det förväntade resultatet och välj antingen ett passande uttryck eller lägg till en extra kontroll.
db<>fiol här
- med prestandatest
Gammal sqlfiddle
Hur fungerar det?
Uttrycket 1 = ALL(arr)
ger:
TRUE
.. om alla element är 1
FALSE
.. om något element är <> 1
(alla element som IS NOT NULL
)NULL
.. om minst ett element IS NULL
och inget element är <> 1
Så, om vi känner till ett enda element som inte kan dyker upp (framtvingas av en CHECK
begränsning), som -1
, kan vi förenkla till:
-1 = ALL(arr) IS NULL
Om några nummer kan dyka upp, se efter två distinkta nummer. Resultatet kan bara vara NULL
för båda om arrayen inte innehåller annat än NULL
. Voilá.