sql >> Databasteknik >  >> RDS >> PostgreSQL

Är array alla NULLs i PostgreSQL

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

1 och 2 kan vara vilken som helst två distinkta nummer.

Alternativ och prestanda

Det finns många sätt. Jag satte ihop ett snabbt testfall:

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() kräver Postgres 9.3 eller senare.
array_positions() kräver Postgres 9.5 eller senare.

chk_michael är från det för närvarande accepterade svaret av @michael .
Kolumnerna är i ordning efter uttryckets prestanda. Snabbast först.
Mina enkla kontroller dominerar prestanda, med array_remove() Nästa. Resten kan inte hänga med.

Den tomma matrisen för specialfall ({} ) kräver uppmärksamhet. Definiera det förväntade resultatet och välj antingen ett passande uttryck eller lägg till en extra kontroll.

db<>fiol här - med prestandatest
Gammal sqlfiddle

Hur fungerar det?

Uttrycket 1 = ALL(arr) ger:

TRUE .. om alla element är 1
FALSE .. om något element är <> 1 (alla element som IS NOT NULL )
NULL .. om minst ett element IS NULL och inget element är <> 1

Så, om vi känner till ett enda element som inte kan dyker upp (framtvingas av en CHECK begränsning), som -1 , kan vi förenkla till:

-1 = ALL(arr) IS NULL

Om några nummer kan dyka upp, se efter två distinkta nummer. Resultatet kan bara vara NULL för båda om arrayen inte innehåller annat än NULL . Voilá.



  1. Yii Sammanfogad tabell men inte alla valda data hämtas

  2. FrankenQueries:när SQL och NoSQL kolliderar

  3. Rust:Hur kör vi en DML på MySQL med många parametrar?

  4. Jämför två datumintervall inom samma tabell