PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Mảng có tất cả các NULL trong PostgreSQL không

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

12 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
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á.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ActiveRecord ::StatementInvalid. Lỗi PG

  2. Lấy nhận xét từ cơ sở dữ liệu PostgreSQL

  3. PostgreSQL:xuất dữ liệu kết quả từ truy vấn SQL sang Excel / CSV

  4. Cú pháp cho row_to_json với sqlalchemy

  5. Cách diễn giải giá trị PosgreSQL txid_current ()