oracle和mysql如何实现合并行

2009年05月06日 作者: 大头刚 

今天同事有个需求,要把结果集所有行合并成1行,每行之间用逗号隔开,尝试了几种方法,把过程记录。

SELECT id FROM test WHERE id<10;
   USER_ID
----------
  1
  2
  3
  4
  5
  6
  7
  8
  9
9 rows selected.

想得到的结果是:1,2,3,4,5,6,7,8,9

第一种方法,使用sql直接算出:

SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(user_id,',')),',') allrow
FROM (SELECT 1,user_id,1+(ROW_NUMBER() over(ORDER BY 1)) node_id,ROW_NUMBER() over(PARTITION BY 1 ORDER BY 1) rn
FROM test WHERE id<20)
START WITH rn = 1
CONNECT BY node_id-1 = PRIOR node_id
GROUP BY 1
ORDER BY 1;
ALLROW
-------------------------------------------------------------
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19

第二种方法,自定义一个函数strcat:

CREATE OR REPLACE TYPE strcat_type AS object (
    cat_string VARCHAR2(4000),
    static FUNCTION ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) RETURN NUMBER,
    member FUNCTION ODCIAggregateIterate(self IN OUT strcat_type,VALUE IN VARCHAR2) RETURN NUMBER,
    member FUNCTION ODCIAggregateMerge(self IN OUT strcat_type,ctx2 IN OUT strcat_type) RETURN NUMBER,
    member FUNCTION ODCIAggregateTerminate(self IN OUT strcat_type,returnValue OUT VARCHAR2,flags IN NUMBER) RETURN NUMBER
  7  )
  8  
  9  /
TYPE created.
CREATE OR REPLACE FUNCTION strcat(input VARCHAR2 )
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING strcat_type;
/
FUNCTION created.
SELECT strcat(a.id) FROM test a WHERE a.user_id<20;
STRCAT(A.USER_ID)
---------------------------------------------------------------
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19

mysql已经写好了group_concat函数,直接调用即可。

mysql> SELECT group_concat( `UID` SEPARATOR  ',' ) AS allrow FROM `test` WHERE id<10;
+-------------------+
| allrow            |
+-------------------+
| 1,2,3,4,5,6,7,8,9 | 
+-------------------+
1 ROW IN SET (0.00 sec)

  • Comments (1)
  • Trackbacks (0)
Leave a comment Trackback

  • logchild 1F

    06月 30th, 2009 at 16:30

    呵呵,尽量不要让DB做运算,玩笑……%……

No trackback yet.