sql >> Databasteknik >  >> RDS >> PostgreSQL

Uteslut matchade arrayelement

Det ser ut som XOR mellan arrayer:

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

Utdata:

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

Hur det fungerar:

  1. Unnesta båda arrayerna
  2. Beräkna SUMMA
  3. Beräkna INTERSECT
  4. Från SUM - INTERSECT
  5. Kombinera till array

Alternativt kan du använda summan av båda minus(utom) operationerna:

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

Använder 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:

Om du bara vill ha element från den andra arrayen som inte är det, använd först enkla 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

Utdata:

"{3,6,7,9}"


  1. MYSQL spela upp dumpfilen allt eller inget i en transaktion

  2. räkna antal nollvariabler per rad mysql

  3. Sammanfoga två tabeller (med ett 1-M-förhållande) där den andra tabellen måste "plattas ut" till en rad

  4. MySQL Beställ före Gruppera efter