sql >> Database teknologi >  >> RDS >> PostgreSQL

Er array alle NULL'er i PostgreSQL

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

1 og 2 kan være hvilken som helst to forskellige numre.

Alternativer og ydeevne

Der er mange måder. Jeg samlede en hurtig testcase:

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 nyere.
array_positions() kræver Postgres 9.5 eller nyere.

chk_michael er fra det aktuelt accepterede svar fra @michael .
Søjlerne er i rækkefølge efter udtrykkets ydeevne. Hurtigste først.
Mine simple checks dominerer ydeevnen med array_remove() Næste. Resten kan ikke følge med.

det tomme array i specialtilfælde ({} ) kræver opmærksomhed. Definer det forventede resultat, og vælg enten et passende udtryk eller tilføj en ekstra markering.

db<>fiddle her - med ydelsestest
Gamle sqlfiddle

Hvordan fungerer det?

Udtrykket 1 = ALL(arr) giver:

TRUE .. hvis alle elementer er 1
FALSE .. hvis et element er <> 1 (ethvert element, der IS NOT NULL )
NULL .. hvis mindst ét ​​element IS NULL og intet element er <> 1

Så hvis vi kender et enkelt element, som ikke kan dukke op (håndhævet af en CHECK constraint), som -1 , kan vi forenkle til:

-1 = ALL(arr) IS NULL

Hvis nogen nummer kan dukke op, tjek for to forskellige numre. Resultatet kan kun være NULL for begge, hvis arrayet ikke indeholder andet end NULL . Voilá.



  1. Postgres hvor klausul sammenligner tidsstempel

  2. Spring Data ser ikke ud til at forstå @Column name

  3. Hvordan finder man alle relationerne mellem alle mysql-tabeller?

  4. SQL:Find den længste fælles streng mellem rækker