1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
og 2
kan være hvilken som helst to forskellige numre.
Alternativer og ydeevne
Der er mange måder. Jeg samlede en hurtig testcase:
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 nyere.array_positions()
kræver Postgres 9.5 eller nyere.
chk_michael
er fra det aktuelt accepterede svar fra @michael
.
Søjlerne er i rækkefølge efter udtrykkets ydeevne. Hurtigste først.
Mine simple checks dominerer ydeevnen med array_remove()
Næste. Resten kan ikke følge med.
det tomme array i specialtilfælde ({}
) kræver opmærksomhed. Definer det forventede resultat, og vælg enten et passende udtryk eller tilføj en ekstra markering.
db<>fiddle her
- med ydelsestest
Gamle sqlfiddle
Hvordan fungerer det?
Udtrykket 1 = ALL(arr)
giver:
TRUE
.. hvis alle elementer er 1
FALSE
.. hvis et element er <> 1
(ethvert element, der IS NOT NULL
)NULL
.. hvis mindst ét element IS NULL
og intet element er <> 1
Så hvis vi kender et enkelt element, som ikke kan dukke op (håndhævet af en CHECK
constraint), som -1
, kan vi forenkle til:
-1 = ALL(arr) IS NULL
Hvis nogen nummer kan dukke op, tjek for to forskellige numre. Resultatet kan kun være NULL
for begge, hvis arrayet ikke indeholder andet end NULL
. Voilá.