1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
en 2
kan elke zijn twee verschillende nummers.
Alternatieven en prestaties
Er zijn veel manieren. Ik heb een snelle testcase samengesteld:
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()
vereist Postgres 9.3 of hoger.array_positions()
vereist Postgres 9.5 of hoger.
chk_michael
is van het momenteel geaccepteerd antwoord van @michael
.
De kolommen staan in volgorde van uitvoering van de expressie. Snelste eerst.
Mijn eenvoudige controles domineren de prestaties, met array_remove()
De volgende. De rest kan het niet bijhouden.
De special case lege array ({}
) aandacht vraagt. Definieer het verwachte resultaat en kies een passende uitdrukking of voeg een extra controle toe.
db<>fiddle hier
- met prestatietest
Oude sqlfiddle
Hoe werkt het?
De uitdrukking 1 = ALL(arr)
opbrengsten:
TRUE
.. als alle elementen 1
zijn FALSE
.. als een element <> 1
is (elk element dat IS NOT NULL
)NULL
.. als ten minste één element IS NULL
en geen enkel element is <> 1
Dus als we een enkel element kennen dat niet kan opdagen (afgedwongen door een CHECK
beperking), zoals -1
, kunnen we vereenvoudigen tot:
-1 = ALL(arr) IS NULL
Indien enig nummer kan verschijnen, controleer op twee verschillende nummers. Het resultaat kan alleen NULL
zijn voor beide als de array niets anders bevat dan NULL
. Voilá.