sql >> Database >  >> RDS >> PostgreSQL

Overeenkomende matrixelementen uitsluiten

Het lijkt op XOR tussen arrays:

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

Uitgang:

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

Hoe het werkt:

  1. Beide arrays ongedaan maken
  2. SOM berekenen
  3. IntersECT berekenen
  4. Van SUM - INTERSECT
  5. Combineren tot array

Als alternatief kunt u de som van beide minus (behalve) bewerkingen gebruiken:

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

Gebruikmakend van 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;

BEWERKEN:

Als je alleen elementen uit de tweede array wilt die dat niet zijn, gebruik dan eerst eenvoudig 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

Uitgang:

"{3,6,7,9}"


  1. Hoe een SQL-instructie in het Oracle SQL-gebied ongeldig te maken, zodat een nieuw plan wordt geproduceerd bij het verzamelen van statistieken?

  2. SSL-verbindingsproblemen tussen go Scratch-container en PG-container. Hoe op te lossen?

  3. C# en MySQL .NET Connector - Is er een manier om SQL Injection-aanvallen in een generieke klasse te voorkomen?

  4. Kan mysql-connector/c (libmysql) niet bouwen vanuit de bron in cygwin