+1 امتیاز
قبل در برنامه نویسی توسط (7.2هزار امتیاز)
ویرایش شده قبل توسط

یک تابع تجمعی در اوراکل 10g مورد نیاز است تا بتواند رشته ها را به هم الحاق کند.

اوراکل 10g یک تابع غیر رسمی (undocumented) با نام wm_concat دارد که معمولا برای رشته ها رفتار عجیب از خود نشان می دهد! ولی برای ارقام تقریبا رفتار قابل قبولی دارد.

SELECT   parent_id, wm_concat (ID) children_ids
    FROM test_mohi
GROUP BY parent_id;

 PARENT_ID
----------
CHILDREN_IDS                                                                    
--------------------------------------------------------------------------------
         1
2,5,4                                                                           
                                                                                
         2
3                                                                               
                                                                                
          
1                                                                               
                                                                                


3 rows selected.

چگونه می توان یک تابع برای الحاق رشته ها نیز نوشت.

1 پاسخ

0 امتیاز
قبل توسط (7.2هزار امتیاز)
ویرایش شده قبل توسط
 
بهترین پاسخ

برای این کار می توانید از تابع داخلی اوراکل با نام LISTAGG استفاده نمایید.

*فقط توجه داشته باشید که این تابع در نسخه 11 به بعد پشتیبانی می شود

WITH aux AS
(
     SELECT 1 id,'a' letter FROM dual UNION
     SELECT 1 id,'b' letter FROM dual UNION
     SELECT 2 id,'c' letter FROM dual UNION
     SELECT 5 id,'d' letter FROM dual UNION
     SELECT 5 id,'e' letter FROM dual
)
SELECT
     id , LISTAGG (letter,'-') WITHIN GROUP (ORDER BY id) string
FROM aux
group by id


        ID
----------
STRING                                                                          
--------------------------------------------------------------------------------
         1
a-b                                                                             
                                                                                
         2
c                                                                               
                                                                                
         5
d-e                                                                             
                                                                                


3 rows selected.

 

 

در نسخه 10 میتوان از XMLAGG استفاده کرد که البته یک مقدار از LISTAGG پیچیده تر است

 

WITH emp AS
     (SELECT 1 deptno, 'Gholi' ename
        FROM DUAL
      UNION ALL
      SELECT 1 deptno, 'Ahmad' ename
        FROM DUAL
      UNION ALL
      SELECT 2 deptno, 'Mammad' ename
        FROM DUAL)
SELECT   deptno,
         RTRIM (XMLAGG (XMLELEMENT (e, ename || ',')).EXTRACT ('//text()'),
                ','
               ) enames
    FROM emp
GROUP BY deptno



    DEPTNO
----------
ENAMES                                                                          
--------------------------------------------------------------------------------
         1
Gholi,Ahmad                                                                     
                                                                                
         2
Mammad                                                                          
                                                                                


2 rows selected.

 

سوالات مشابه

+1 امتیاز
1 پاسخ 301 بازدید
+1 امتیاز
1 پاسخ 864 بازدید
+1 امتیاز
1 پاسخ 318 بازدید
+1 امتیاز
1 پاسخ 502 بازدید
0 امتیاز
1 پاسخ 875 بازدید
+1 امتیاز
1 پاسخ 380 بازدید
...