PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में एकाधिक सरणियों का प्रतिच्छेदन

एक सरणी चौराहे की सबसे नज़दीकी चीज जिसके बारे में मैं सोच सकता हूं वह यह है:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में भेद्यता अंतर को कैसे बंद करें

  2. क्या आप CREATE TABLE परिभाषा में एक इंडेक्स बना सकते हैं?

  3. जावा का उपयोग करके PostgreSQL में समय संग्रहीत करने का सबसे अनुशंसित तरीका क्या है?

  4. प्लेसहोल्डर के रूप में प्रश्न चिह्न की व्याख्या करने से पीडीओ को कैसे रोकें?

  5. पोस्टग्रेज़ टेबल कॉलम नाम प्रतिबंध?