PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apakah array semua NULL di PostgreSQL

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

1 dan 2 bisa apa saja dua angka berbeda.

Alternatif dan performa

Ada banyak cara. Saya menyusun kasus uji cepat:

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() membutuhkan Postgres 9.3 atau yang lebih baru.
array_positions() membutuhkan Postgres 9.5 atau lebih baru.

chk_michael berasal dari jawaban yang saat ini diterima oleh @michael .
Kolom berada dalam urutan kinerja ekspresi. Paling cepat dulu.
Cek sederhana saya mendominasi kinerja, dengan array_remove() Berikutnya. Sisanya tidak bisa mengikuti.

Larik kosong kasus khusus ({} ) membutuhkan perhatian. Tentukan hasil yang diharapkan dan pilih ekspresi yang pas atau tambahkan tanda centang tambahan.

db<>fiddle di sini - dengan uji kinerja
Lama sqlfiddle

Bagaimana cara kerjanya?

Ekspresi 1 = ALL(arr) hasil:

TRUE .. jika semua elemen adalah 1
FALSE .. jika ada elemen <> 1 (elemen apa pun yang IS NOT NULL )
NULL .. jika setidaknya satu elemen IS NULL dan tidak ada elemen <> 1

Jadi, jika kita mengetahui satu elemen yang tidak bisa muncul (dilakukan oleh CHECK kendala), seperti -1 , kita bisa sederhanakan menjadi:

-1 = ALL(arr) IS NULL

Jika ada nomor dapat muncul, periksa dua nomor yang berbeda. Hasilnya hanya bisa NULL untuk keduanya jika array tidak berisi apa-apa selain NULL . Voila.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengaturan Django mengonfigurasi basis data dengan dua mesin

  2. Bagaimana menemukan semua titik dalam poligon di postgis?

  3. postgresql:membagi periode waktu di acara

  4. Menampilkan Total Bulanan dari Beberapa Kolom di PostgreSQL

  5. Postgres 9.4 hang selama tampilan terwujud yang menyegarkan