1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
i 2
może być dowolny dwie różne liczby.
Alternatywy i wydajność
Jest wiele sposobów. Zbudowałem szybki przypadek testowy:
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()
wymaga Postgresa 9.3 lub nowszego.array_positions()
wymaga Postgresa 9.5 lub nowszego.
chk_michael
pochodzi z aktualnie zaakceptowanej odpowiedzi @michaela
.
Kolumny są w kolejności wykonania wyrażenia. Najpierw najszybszy.
Moje proste kontrole dominują w wydajności dzięki array_remove()
następny. Reszta nie może nadążyć.
specjalna pusta tablica ({}
) wymaga uwagi. Zdefiniuj oczekiwany wynik i wybierz pasujące wyrażenie lub dodaj dodatkowe sprawdzenie.
db<>fiddle tutaj
- z testem wydajności
Stary sqlfiddle
Jak to działa?
Wyrażenie 1 = ALL(arr)
wydajność:
TRUE
.. jeśli wszystkie elementy to 1
FALSE
.. jeśli jakikolwiek element to <> 1
(każdy element, który IS NOT NULL
)NULL
.. jeśli przynajmniej jeden element IS NULL
a żaden element nie jest <> 1
Tak więc, jeśli znamy pojedynczy element, którego nie można pokaż się (wymuszone przez CHECK
ograniczenie), jak -1
, możemy uprościć do:
-1 = ALL(arr) IS NULL
Jeśli jakikolwiek numer może się pojawić, sprawdź dwie różne liczby. Wynik może być tylko NULL
dla obu, jeśli tablica zawiera tylko NULL
. Voila.