1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
и 2
могут быть любыми двумя разными числами.
Альтернативы и производительность
Есть несколько способов. Я собрал тестовый пример, чтобы увидеть, какой из них самый быстрый:
SELECT arr
, 1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL AS chk_simpl
, TRUE = ALL (SELECT unnest(arr) IS NULL) AS chk_michael
, (SELECT bool_and(e IS NULL) FROM unnest(arr) e) AS chk_bool_and
, NOT EXISTS (SELECT unnest(arr) EXCEPT SELECT null) AS chk_exist
FROM (
VALUES
('{1,2,NULL,3}'::int[])
, ('{1,1,1}')
, ('{2,2,2}')
, ('{NULL,NULL,NULL}'::int[])
, ('{}'::int[])
) t1(arr);
Второй — из принятого в настоящее время ответа @michael. Столбцы расположены в порядке выполнения выражения. Сначала самый быстрый. Предложенное мной выражение на самом деле во много раз быстрее, чем остальные. Отсюда мой ответ.
Обратите внимание на разные результаты для ввода пустого массива. (Какой ответ вы ожидаете для пустого массива?)
db‹›fiddle здесь — с демонстрацией и тестом производительности< br /> Старый sqlfiddle
Как это работает?
Выражение 1 = ALL(arr)
дает
TRUE
.. если все элементы 1
FALSE
.. если какой-либо элемент <> 1
(любой элемент, который IS NOT NULL
)
NULL
.. если хотя бы один элемент IS NULL
и ни один элемент не <> 1
Итак, если мы знаем один элемент, который не может отображаться, например -1
, мы можем упростить его до:
-1 = ALL(arr) IS NULL
Если может появиться любое число, проверьте наличие двух различных чисел. Результат может быть только NULL
для обоих, если массив не содержит ничего, кроме NULL
. Вуаля.
person
Erwin Brandstetter
schedule
07.03.2014
generate_series()
сможет помочь. - person ypercubeᵀᴹ   schedule 28.07.2011