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

Kecualikan elemen array yang cocok

Sepertinya XOR antar array:

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

Keluaran:

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

Cara kerjanya:

  1. Hapus sarang kedua array
  2. Hitung SUM
  3. Hitung INTERSECT
  4. Dari SUM - INTERSECT
  5. Gabungkan ke larik

Atau Anda dapat menggunakan jumlah dari kedua operasi minus (kecuali):

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

Memanfaatkan 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;

EDIT:

Jika Anda hanya menginginkan elemen dari array kedua yang bukan yang pertama gunakan EXCEPT sederhana :

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

Keluaran:

"{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. PDO tidak melempar pengecualian dengan parameter tidak terikat (dan tidak ada variabel dalam kueri)

  2. Menginstal Postgres di windows untuk digunakan dengan Ruby-on-Rails

  3. Pembuatan kode yang apik hanya untuk satu skema

  4. Bagaimana cara mengubah gaya tanggal di PostgreSQL?

  5. pg_restore tidak dapat menjalankan kueri:ERROR:nama lokal tidak valid:en_US.UTF-8