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

Loại trừ các phần tử mảng phù hợp

Có vẻ như XOR giữa các mảng:

WITH set1 AS
(
 SELECT * FROM unnest('{1, 2, 5, 15}'::int[])
), set2 AS
(
 SELECT * FROM unnest('{1, 2, 3, 6, 7, 9, 15}'::int[])
), xor AS
(
  (SELECT * FROM set1
   UNION 
   SELECT * FROM set2)
  EXCEPT
  (SELECT * FROM set1
   INTERSECT 
   SELECT * FROM set2)
)
SELECT array_agg(unnest ORDER BY unnest)
FROM xor

Đầu ra:

"{3,5,6,7,9}"

Cách hoạt động:

  1. Bỏ kết hợp cả hai mảng
  2. Tính SUM
  3. Tính INTERSECT
  4. Từ SUM - INTERSECT
  5. Kết hợp thành mảng

Ngoài ra, bạn có thể sử dụng tổng của cả hai phép toán trừ (ngoại trừ):

(A+B) - (A^B)
<=>
(A-B) + (B-A)

Sử dụng FULL JOIN :

WITH set1 AS
(
 SELECT *
FROM unnest('{1, 2, 5, 15}'::int[])
), set2 AS
(
 SELECT *
 FROM unnest('{1, 2, 3, 6, 7, 9, 15}'::int[])
)
SELECT array_agg(COALESCE(s1.unnest, s2.unnest) 
                 ORDER BY COALESCE(s1.unnest, s2.unnest))
FROM set1 s1
FULL JOIN set2 s2
  ON s1.unnest = s2.unnest
WHERE s1.unnest IS NULL
  OR s2.unnest IS NULL;

CHỈNH SỬA:

Nếu bạn chỉ muốn các phần tử từ mảng thứ hai không phải là mảng đầu tiên, hãy sử dụng EXCEPT đơn giản :

SELECT array_agg(unnest ORDER BY unnest)
FROM (SELECT * FROM unnest('{1, 2, 3, 6, 7, 9, 15}'::int[])
      EXCEPT
      SELECT * FROM unnest('{1, 2, 5, 15}'::int[])) AS sub

Đầu ra:

"{3,6,7,9}"


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_dump với người dùng không có superradmin và các đối tượng lớn

  2. Heroku pg:pull không điền giản đồ

  3. Truy vấn Ecto - Ngày + Khoảng postgres + Nội suy truy vấn

  4. Cách sao chép một cột của bảng vào cột của bảng khác trong PostgreSQL so sánh cùng một ID

  5. Nghiên cứu độ chậm của PostGIS (ấn bản 2019)