1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
và 2
có thể là bất kỳ hai số phân biệt.
Các giải pháp thay thế và hiệu suất
Có rất nhiều cách. Tôi đã tập hợp một trường hợp thử nghiệm nhanh:
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()
yêu cầu Postgres 9.3 trở lên.
array_positions()
yêu cầu Postgres 9.5 trở lên.
chk_michael
là từ câu trả lời hiện được chấp nhận bởi @michael
.
Các cột theo thứ tự thực hiện của biểu thức. Nhanh nhất trước.
Các phép kiểm tra đơn giản của tôi chiếm ưu thế về hiệu suất, với array_remove()
tiếp theo. Phần còn lại không theo kịp.
Mảng trống chữ hoa đặc biệt ({}
) yêu cầu chú ý. Xác định kết quả mong đợi và chọn một biểu thức phù hợp hoặc thêm một kiểm tra bổ sung.
db <> fiddle tại đây
- với kiểm tra hiệu suất
cũ sqlfiddle
Nó hoạt động như thế nào?
Biểu thức 1 = ALL(arr)
sản lượng:
TRUE
.. nếu tất cả các phần tử là 1
FALSE
.. nếu bất kỳ phần tử nào là <> 1
(bất kỳ phần tử nào IS NOT NULL
)
NULL
.. nếu ít nhất một phần tử IS NULL
và không có phần tử nào là <> 1
Vì vậy, nếu chúng ta biết một yếu tố duy nhất không thể hiển thị (được thực thi bởi CHECK
ràng buộc), như -1
, chúng tôi có thể đơn giản hóa thành:
-1 = ALL(arr) IS NULL
Nếu bất kỳ số có thể hiển thị, kiểm tra hai số phân biệt. Kết quả chỉ có thể là NULL
cho cả hai nếu mảng không chứa gì ngoại trừ NULL
. Voilá.