PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy tablica zawiera wszystkie wartości NULL w PostgreSQL

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zautomatyzowane testowanie kopii zapasowych PostgreSQL

  2. Śledź zewnętrzną bazę danych z Heroku

  3. 3 sposoby na wyświetlenie listy wszystkich procedur składowanych w bazie danych PostgreSQL

  4. Czy powinienem mieć swój katalog Postgres tuż obok folderu mojego projektu? Jeśli tak to jak?

  5. Uzyskaj wartości z pierwszego i ostatniego wiersza na grupę