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

Oracle LISTAGG फ़ंक्शन का उपयोग कैसे करें

Oracle LISTAGG फ़ंक्शन एक विश्लेषणात्मक कार्य है जो हमें ऑर्डर_बाय_क्लॉज के आधार पर प्रत्येक समूह के लिए माप_कॉलम के लिए स्ट्रिंग्स को संयोजित करने की अनुमति देता है। यह Oracle में 11gR2 से मौजूद है

Oracle में LISTAGG फ़ंक्शन का सिंटैक्स है

LISTAGG (measure_column [, 'delimiter'])
WITHIN GROUP (order_by_clause) [OVER (query_partition_clause)]

शर्तों की व्याख्या

माप_स्तंभ वह कॉलम या एक्सप्रेशन जिसके मान आप परिणाम सेट में एक साथ जोड़ना चाहते हैं। माप_स्तंभ में शून्य मानों पर ध्यान नहीं दिया जाता है।
सीमांकक वैकल्पिक। यह measure_column . को अलग करते समय उपयोग करने वाला सीमांकक है परिणाम आउटपुट करते समय मान।
order_by_clause यह उस क्रम को निर्धारित करता है जिसमें संयोजित मान लौटाए जाते हैं

आइए LISTAGG फ़ंक्शन पर कुछ मामले और उदाहरण देखें

1) एकल-सेट समग्र फ़ंक्शन के रूप में, LISTAGG सभी पंक्तियों पर कार्य करता है और एकल आउटपुट पंक्ति देता है।

SELECT LISTAGG(first_name, '; ')
WITHIN GROUP (ORDER BY hire_date, last_name) "Employee_list",
MIN(hire_date) "Earliest"
FROM emp
WHERE dept_no = 30;

Employee_list                                                Earliest
------------------------------------------------------------ ---------
TOM; BOB; BILL                                            17-JUN-18

2) ग्रुप-सेट एग्रीगेट के रूप में, फंक्शन चालू होता है और ग्रुप बाय क्लॉज द्वारा परिभाषित प्रत्येक समूह के लिए एक आउटपुट रो देता है।

COLUMN employees FORMAT A50
SELECT deptno, LISTAGG(ename, ';') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; BILL

More Example

select table_name,
listagg(index_name, ',') within group (order by index_name) all_inds
from user_indexes
group by table_name;

3) एक विश्लेषणात्मक कार्य के रूप में, LISTAGG query_partition_clause में एक या अधिक एक्सप्रेशन के आधार पर सेट किए गए क्वेरी परिणाम को समूहों में विभाजित करता है।

SQL> SELECT deptno
, ename
, hiredate
, LISTAGG(ename, ',')
WITHIN GROUP (ORDER BY hiredate)
OVER (PARTITION BY deptno) AS employees
FROM emp  order by deptno;

DEPTNO ENAME HIREDATE EMPLOYEES
---------- ---------- ----------- -------------------------------------
10 JOSHUA 09/06/2018 JOSHUA,KING,MILLER
10 KING 17/11/2018 JOSHUA,KING,MILLER
10 MILLER 23/01/2018 JOSHUA,KING,MILLER
20 AJAY 17/12/2018 AJAY,FANES,SCOTT,SMITH
20 FANES 02/04/2018 AJAY,FANES,SCOTT,SMITH
20 SCOTT 19/04/2018 AJAY,FANES,SCOTT,SMITH
20 SMITH 23/05/2018 AJAY,FANES,SCOTT,SMITH
30 TOM 20/02/2018 TOM; BOB; BILL
30 BOB 22/02/2018 TOM; BOB; BILL
30 BILL 01/05/2018 TOM; BOB; BILL

Oracle डेटाबेस 12cR2 से LISTAGG फ़ंक्शन में जोड़ना

वर्णों की अधिकतम संख्या 4000 बाइट्स है और यदि यह इससे अधिक है, तो यह त्रुटि देता है

ORA-01489:स्ट्रिंग संयोजन का परिणाम बहुत लंबा है

Oracle 12cR2 के साथ, Oracle ने अतिप्रवाह त्रुटियों को इनायत से संभालने के लिए अतिप्रवाह ट्रंकेट पर एक खंड प्रदान किया है

listagg (
measure, ','
[ on overflow (truncate|error) ]
[ text ] [ (with|without) count ]
) within group (order by cols)

अब आप स्पष्ट रूप से कह सकते हैं कि आप त्रुटि चाहते हैं या काट-छांट शब्दार्थ। 12cR2 से पहले के कोड ठीक काम करते हैं क्योंकि यह डिफ़ॉल्ट व्यवहार होता है

अब मान लीजिए, जब आप 4k बाइट्स को पार कर जाते हैं तो आप त्रुटि वापस नहीं करना चाहते हैं, फिर ओवरफ्लो ट्रंकेट पर समाधान है।

select table_name,
listagg(index_name, ',' on overflow truncate) within group (order by index_name) inds
from user_indexes
group by table_name;

यदि काट-छांट होती है, तो Oracle अगले पूर्ण मान पर वापस आ जाएगा, जिस बिंदु पर आप यह नियंत्रित कर सकते हैं कि आप उपयोगकर्ता को यह कैसे बता सकते हैं कि सूची को छोटा कर दिया गया है। डिफ़ॉल्ट रूप से हम स्ट्रिंग में तीन डॉट्स '...' को संकेतक के रूप में जोड़ते हैं कि ट्रंकेशन हुआ है। आप '...' को बदल सकते हैं यदि आप चाहें तो इसे ओवरराइड कर सकते हैं

यदि आप "..." को "अधिक", "अतिरिक्त" या "अधिक के लिए क्लिक करें" हाइपरलिंक से बदलना चाहते हैं, तो बस अपनी नई स्ट्रिंग प्रदान करें!

select table_name,
listagg(index_name, ',' on overflow truncate
'|||'
) within group (order by index_name) inds
from user_indexes
group by table_name;

डिफ़ॉल्ट रूप से, ट्रंकेट लापता मानों की गिनती दिखाता है यदि गिनती नहीं दिखाना चाहते हैं, तो बिना गिनती के उपयोग करें

select table_name,
listagg(index_name, ',' on overflow truncate '....' without count) within group (order by index_name) inds
from user_indexes
group by table_name;

पूर्व 11GR2 समाधान (10g, 9i, 11gR1)

यदि आप 11g रिलीज़ 2 या इसके बाद के संस्करण नहीं चला रहे हैं, लेकिन डेटाबेस का एक संस्करण चला रहे हैं जहाँ WM_CONCAT फ़ंक्शन मौजूद है, तो यह एक शून्य प्रयास समाधान है क्योंकि यह आपके लिए एकत्रीकरण करता है। यह वास्तव में नीचे वर्णित उपयोगकर्ता परिभाषित समग्र कार्य का एक उदाहरण है, लेकिन Oracle ने आपके लिए सभी कार्य किए हैं।

COLUMN employees FORMAT A50
SELECT deptno, wm_concat(ename) AS employees
FROM emp
GROUP BY deptno;
EPTNO EMPLOYEES
---------- --------------------------------------------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; BILL

यह उपयोगकर्ता परिभाषित फ़ंक्शन के माध्यम से भी प्राप्त किया जा सकता है। मैं नीचे दिए गए आस्कटॉम लिंक की जांच करने की सलाह दूंगा। इसे अवश्य पढ़ें

लिस्टैग वैकल्पिक विकल्प

मुझे आशा है कि आपको  Oracle LISTAGG फंक्शन . पर इस पोस्ट की सामग्री पसंद आई होगी

संबंधित लेख
ऑटो इंक्रीमेंट कॉलम - Oracle और mysql में डिफ़ॉल्ट मान के रूप में अनुक्रम
Oracle जुड़ता है
एसक्यूएल सेट ऑपरेटर
Oracle plsql में Google अनुवाद URL का उपयोग कैसे करें
एकल पंक्ति फ़ंक्शन में sql
ओरेकल में दिनांक फ़ंक्शन

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डेटाबेस में फाइल कैसे डालें?

  2. 9i क्लाइंट से 11g डेटाबेस से कनेक्ट करते समय ORA-01017 अमान्य उपयोगकर्ता नाम/पासवर्ड

  3. मैं संग्रहीत प्रक्रिया से प्रभावित रिकॉर्ड्स की संख्या कैसे प्राप्त कर सकता हूं?

  4. मैं Oracle में SQL निष्पादन योजना कैसे देख सकता हूँ?

  5. कर्सर अप्रचलन डंप