एक सरणी चौराहे की सबसे नज़दीकी चीज जिसके बारे में मैं सोच सकता हूं वह यह है:
select array_agg(e)
from (
select unnest(a1)
intersect
select unnest(a2)
) as dt(e)
यह मानता है कि a1
और a2
एक ही प्रकार के तत्वों के साथ एकल आयाम सरणियाँ हैं। आप इसे किसी फ़ंक्शन में कुछ इस तरह से लपेट सकते हैं:
create function array_intersect(a1 int[], a2 int[]) returns int[] as $$
declare
ret int[];
begin
-- The reason for the kludgy NULL handling comes later.
if a1 is null then
return a2;
elseif a2 is null then
return a1;
end if;
select array_agg(e) into ret
from (
select unnest(a1)
intersect
select unnest(a2)
) as dt(e);
return ret;
end;
$$ language plpgsql;
तब आप इस तरह के काम कर सकते थे:
=> select array_intersect(ARRAY[2,4,6,8,10], ARRAY[1,2,3,4,5,6,7,8,9,10]);
array_intersect
-----------------
{6,2,4,10,8}
(1 row)
ध्यान दें कि यह लौटाए गए सरणी में किसी विशेष ऑर्डर की गारंटी नहीं देता है लेकिन यदि आप इसकी परवाह करते हैं तो आप इसे ठीक कर सकते हैं। तब आप अपना स्वयं का समग्र कार्य बना सकते हैं:
-- Pre-9.1
create aggregate array_intersect_agg(
sfunc = array_intersect,
basetype = int[],
stype = int[],
initcond = NULL
);
-- 9.1+ (AFAIK, I don't have 9.1 handy at the moment
-- see the comments below.
create aggregate array_intersect_agg(int[]) (
sfunc = array_intersect,
stype = int[]
);
और अब हम देखते हैं कि क्यों array_intersect
एनयूएलएल के साथ मजाकिया और कुछ हद तक अजीब चीजें करता है। हमें एकत्रीकरण के लिए एक प्रारंभिक मूल्य की आवश्यकता है जो सार्वभौमिक सेट की तरह व्यवहार करता है और हम उसके लिए NULL का उपयोग कर सकते हैं (हाँ, यह थोड़ी गंध है लेकिन मैं अपने सिर के ऊपर से कुछ भी बेहतर नहीं सोच सकता)।
एक बार यह सब हो जाने के बाद, आप इस तरह के काम कर सकते हैं:
> select * from stuff;
a
---------
{1,2,3}
{1,2,3}
{3,4,5}
(3 rows)
> select array_intersect_agg(a) from stuff;
array_intersect_agg
---------------------
{3}
(1 row)
बिल्कुल सरल या कुशल नहीं लेकिन शायद एक उचित प्रारंभिक बिंदु और कुछ भी नहीं से बेहतर।
उपयोगी संदर्भ:
array_agg
- कुल बनाएं
- फ़ंक्शन बनाएं
- पीएल/पीजीएसक्यूएल
unnest