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.