sql >> Database >  >> RDS >> PostgreSQL

Is array alle NULL's in PostgreSQL

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

1 en 2 kan elke zijn twee verschillende nummers.

Alternatieven en prestaties

Er zijn veel manieren. Ik heb een snelle testcase samengesteld:

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() vereist Postgres 9.3 of hoger.
array_positions() vereist Postgres 9.5 of hoger.

chk_michael is van het momenteel geaccepteerd antwoord van @michael .
De kolommen staan ​​in volgorde van uitvoering van de expressie. Snelste eerst.
Mijn eenvoudige controles domineren de prestaties, met array_remove() De volgende. De rest kan het niet bijhouden.

De special case lege array ({} ) aandacht vraagt. Definieer het verwachte resultaat en kies een passende uitdrukking of voeg een extra controle toe.

db<>fiddle hier - met prestatietest
Oude sqlfiddle

Hoe werkt het?

De uitdrukking 1 = ALL(arr) opbrengsten:

TRUE .. als alle elementen 1 zijn
FALSE .. als een element <> 1 is (elk element dat IS NOT NULL )
NULL .. als ten minste één element IS NULL en geen enkel element is <> 1

Dus als we een enkel element kennen dat niet kan opdagen (afgedwongen door een CHECK beperking), zoals -1 , kunnen we vereenvoudigen tot:

-1 = ALL(arr) IS NULL

Indien enig nummer kan verschijnen, controleer op twee verschillende nummers. Het resultaat kan alleen NULL zijn voor beide als de array niets anders bevat dan NULL . Voilá.



  1. Benoemde Query in slaapstand zetten - voeg samen met 3 tabellen

  2. MySQL-hercodering bewerken met een HTML-formulier

  3. Datum in UTC in mysql

  4. SQL Inner join op geselecteerde instructies