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

PostgreSQL 'समूह द्वारा' क्वेरी में स्ट्रिंग फ़ील्ड के तारों को कैसे संयोजित करें?

PostgreSQL 9.0 या उच्चतर:

आधुनिक पोस्टग्रेज (2010 से) में string_agg(expression, delimiter) है फ़ंक्शन जो ठीक वही करेगा जो पूछने वाला ढूंढ रहा था:

SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;

Postgres 9 ने ORDER BY . निर्दिष्ट करने की क्षमता भी जोड़ी है किसी भी समग्र अभिव्यक्ति में खंड; अन्यथा आपको अपने सभी परिणामों का आदेश देना होगा या एक अपरिभाषित आदेश से निपटना होगा। तो अब आप लिख सकते हैं:

SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;

PostgreSQL 8.4.x:

PostgreSQL 8.4 (2009 में) ने समग्र कार्य array_agg(expression) introduced की शुरुआत की जो एक सरणी में मान एकत्र करता है। फिर array_to_string() वांछित परिणाम देने के लिए इस्तेमाल किया जा सकता है:

SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;

PostgreSQL 8.3.x और पुराना:

जब यह प्रश्न मूल रूप से सामने आया था, तो स्ट्रिंग्स को जोड़ने के लिए कोई अंतर्निहित समग्र कार्य नहीं था। सबसे सरल कस्टम कार्यान्वयन (इस मेलिंग सूची पोस्ट में कई अन्य लोगों के बीच में वाजदा गाबो द्वारा सुझाया गया) अंतर्निहित textcat का उपयोग करना है फ़ंक्शन (जो || . के पीछे है ऑपरेटर):

CREATE AGGREGATE textcat_all(
  basetype    = text,
  sfunc       = textcat,
  stype       = text,
  initcond    = ''
);

यह रहा CREATE AGGREGATE दस्तावेज़ीकरण।

यह बिना किसी विभाजक के सभी तारों को एक साथ चिपका देता है। अंत में बिना उनके बीच में "," डालने के लिए, आप अपना स्वयं का संयोजन कार्य करना चाहेंगे और इसे ऊपर "टेक्स्टकैट" के लिए प्रतिस्थापित कर सकते हैं। यहाँ एक है जिसे मैंने एक साथ रखा और 8.3.12 को परीक्षण किया:

CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
  BEGIN
    IF acc IS NULL OR acc = '' THEN
      RETURN instr;
    ELSE
      RETURN acc || ', ' || instr;
    END IF;
  END;
$$ LANGUAGE plpgsql;

यह संस्करण अल्पविराम का उत्पादन करेगा, भले ही पंक्ति में मान शून्य या खाली हो, इसलिए आपको इस तरह का आउटपुट मिलता है:

a, b, c, , e, , g

अगर आप इसे आउटपुट करने के लिए अतिरिक्त कॉमा हटाना पसंद करेंगे:

a, b, c, e, g

फिर एक ELSIF जोड़ें फ़ंक्शन को इस तरह जांचें:

CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
  BEGIN
    IF acc IS NULL OR acc = '' THEN
      RETURN instr;
    ELSIF instr IS NULL OR instr = '' THEN
      RETURN acc;
    ELSE
      RETURN acc || ', ' || instr;
    END IF;
  END;
$$ LANGUAGE plpgsql;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कैसे date_trunc () PostgreSQL में काम करता है

  2. PostgreSQL के लिए pgModeler का अवलोकन

  3. PostgreSQL डेटाबेस में MySQL डंप आयात करें

  4. PostgreSQL के लिए pt-pg-सारांश Percona टूलकिट का उपयोग करना

  5. SQL - एकाधिक समान प्रश्नों का मेल