ऐसा लगता है 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}"
यह कैसे काम करता है:
- दोनों सरणियों को अननेस्ट करें
- योग की गणना करें
- प्रतिच्छेद की गणना करें
- एसयूएम से - इंटरसेक्ट
- सरणी में संयोजित करें
वैकल्पिक रूप से आप दोनों माइनस (सिवाय) संचालन के योग का उपयोग कर सकते हैं:
(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}"