1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
и 2
може да бъде всеки две различни числа.
Алтернативи и производителност
Има много начини. Сглобих бърз тест:
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()
изисква Postgres 9.3 или по-нова версия.array_positions()
изисква Postgres 9.5 или по-нова версия.
chk_michael
е от текущо приет отговор от @michael
.
Колоните са по реда на изпълнение на израза. Първо най-бързият.
Моите прости проверки доминират в производителността с array_remove()
следващия. Останалите не могат да се справят.
Празният масив в специални случаи ({}
) изисква внимание. Дефинирайте очаквания резултат и или изберете подходящ израз, или добавете допълнителна проверка.
db<>fiddle тук
- стест за ефективност
Стар sqlfiddle
Как работи?
Изразът 1 = ALL(arr)
дава:
TRUE
.. ако всички елементи са 1
FALSE
.. ако някой елемент е <> 1
(всеки елемент, който IS NOT NULL
)NULL
.. ако поне един елемент IS NULL
и нито един елемент не е <> 1
Така че, ако знаем един елемент, който не може се появи (наложено от CHECK
ограничение), като -1
, можем да опростим до:
-1 = ALL(arr) IS NULL
Ако някакви може да се покаже номер, проверете за две различни числа. Резултатът може да бъде само NULL
и за двете, ако масивът не съдържа нищо освен NULL
. Ето.