sql >> Databáze >  >> RDS >> PostgreSQL

Je pole všech NULL v PostgreSQL

1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL

1 a 2 může být jakýkoli dvě různá čísla.

Alternativy a výkon

Existuje mnoho způsobů. Sestavil jsem rychlý testovací případ:

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() vyžaduje Postgres 9.3 nebo novější.
array_positions() vyžaduje Postgres 9.5 nebo novější.

chk_michael pochází z aktuálně přijímané odpovědi od @michael .
Sloupce jsou seřazeny podle výkonu výrazu. Nejdřív nejrychlejší.
Výkonu dominují moje jednoduché kontroly s array_remove() další. Zbytek nemůže držet krok.

Prázdné pole zvláštního případu ({} ) vyžaduje pozornost. Definujte očekávaný výsledek a buď vyberte vhodný výraz, nebo přidejte další kontrolu.

db<>fiddle zde - s testem výkonu
Staré sqlfiddle

Jak to funguje?

Výraz 1 = ALL(arr) výnosy:

TRUE .. pokud jsou všechny prvky 1
FALSE .. pokud je některý prvek <> 1 (jakýkoli prvek, který IS NOT NULL )
NULL .. pokud alespoň jeden prvek IS NULL a žádný prvek není <> 1

Pokud tedy známe jeden jediný prvek, který nemůže zobrazit (vynuceno CHECK omezení), například -1 , můžeme zjednodušit na:

-1 = ALL(arr) IS NULL

Pokud nějaké číslo se může zobrazit, zkontrolujte dvě různá čísla. Výsledek může být pouze NULL pro obojí, pokud pole neobsahuje nic jiného než NULL . Voilá.



  1. docker-compose:pokaždé znovu inicializuje databázi MySQL

  2. Použijte výsledek hromadného shromažďování ve výběrovém dotazu bez kurzoru

  3. Oracle - pomocí vazebné proměnné v klauzuli LIKE dynamického kurzoru

  4. MySQL Zobrazit granty pro všechny uživatele