PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Това е масив, всички NULL в PostgreSQL

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 . Ето.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PG::SyntaxError за rails приложение

  2. Мащабиране на връзките в PostgreSQL с помощта на пул на връзки

  3. Групова актуализация в postgreSQL с помощта на unnest

  4. Инсталирайте PostgreSQL на Ubuntu 18.04

  5. Импортиране на CSV данни в приложението Rails, като се използва нещо различно от идентификатора на асоциацията