PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изключване на съответстващите елементи на масива

Изглежда като XOR между масиви:

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

Изход:

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

Как работи:

  1. Отстраняване на двата масива
  2. Изчислете SUM
  3. Изчислете INTERSECT
  4. От SUM - INTERSECT
  5. Комбинирайте в масив

Като алтернатива можете да използвате сумата от двете операции минус (изключение):

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

Използване на 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;

РЕДАКТИРАНЕ:

Ако искате само елементи от втория масив, които не са, първо използвайте просто EXCEPT :

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

Изход:

"{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. Postgres:Защо производителността е толкова лоша на подселекти с Offset/Limit

  2. Отстраняване на грешки в програма, която използва SIGINT с gdb

  3. Купа сено на Django с Elasticsearch не може да намери база данни при повторно изграждане на индекс

  4. Насочва всички потребители в група с пол мъжки

  5. Postgis SQL за най-близките съседи