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)
Leave a Reply.




logchild 1F
06月 30th, 2009 at 16:30
呵呵,尽量不要让DB做运算,玩笑……%……