1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
a 2
může být jakýkoli dvě různá čísla.
Alternativy a výkon
Existuje mnoho způsobů. Sestavil jsem rychlý testovací případ:
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()
vyžaduje Postgres 9.3 nebo novější.array_positions()
vyžaduje Postgres 9.5 nebo novější.
chk_michael
pochází z aktuálně přijímané odpovědi od @michael
.
Sloupce jsou seřazeny podle výkonu výrazu. Nejdřív nejrychlejší.
Výkonu dominují moje jednoduché kontroly s array_remove()
další. Zbytek nemůže držet krok.
Prázdné pole zvláštního případu ({}
) vyžaduje pozornost. Definujte očekávaný výsledek a buď vyberte vhodný výraz, nebo přidejte další kontrolu.
db<>fiddle zde
- s testem výkonu
Staré sqlfiddle
Jak to funguje?
Výraz 1 = ALL(arr)
výnosy:
TRUE
.. pokud jsou všechny prvky 1
FALSE
.. pokud je některý prvek <> 1
(jakýkoli prvek, který IS NOT NULL
)NULL
.. pokud alespoň jeden prvek IS NULL
a žádný prvek není <> 1
Pokud tedy známe jeden jediný prvek, který nemůže zobrazit (vynuceno CHECK
omezení), například -1
, můžeme zjednodušit na:
-1 = ALL(arr) IS NULL
Pokud nějaké číslo se může zobrazit, zkontrolujte dvě různá čísla. Výsledek může být pouze NULL
pro obojí, pokud pole neobsahuje nic jiného než NULL
. Voilá.