当前位置: 代码迷 >> DB2 >> 把MSSQL的一个合并函数 转到 DB2 上! = =;解决方案
  详细解决方案

把MSSQL的一个合并函数 转到 DB2 上! = =;解决方案

热度:1496   发布时间:2013-02-26 00:00:00.0
把MSSQL的一个合并函数 转到 DB2 上! = =;
--创建一个合并的函数
create   function   f_merge(@name   varchar(100))
returns   varchar(8000)
as
begin
    declare   @str   varchar(8000)
    set   @str   =   ' '
    select   @str   =   @str   +   ', '   +   cast(tel   as   varchar(100))   from   表名   where   name   =   @name
    set   @str   =   stuff(@str   ,   1,1, ' ')
    return(@str)
End
go



------解决方案--------------------------------------------------------
还是用刚回答另一个问题时用的临时表:
CREATE TABLE TEMP.DG(
ID INTEGER,
NANME VARCHAR(1),
PARENT_ID INTEGER
);
INSERT INTO TEMP.DG VALUES
(1, 'A ',0),
(2, 'B ',1),
(3, 'C ',2),
(4, 'D ',1),
(5, 'E ',4);

你的需求是最终生成STR=A,B,C,D,E
下面算法实现表中字符连接

WITH TMP (NANME,ROWNUM) AS (
SELECT NANME,RANK() OVER(ORDER BY ID) FROM TEMP.DG --WHERE PARENT_ID=1
) ,
TMP2(STR,ROWNUM)AS
(SELECT CAST(NANME AS VARCHAR(100)) ,ROWNUM FROM TMP WHERE ROWNUM=1
UNION ALL
SELECT STR|| ', '||A.NANME , A.ROWNUM FROM TMP A ,TMP2 B WHERE A.ROWNUM=B.ROWNUM+1)
SELECT * FROM TMP2 WHERE ROWNUM=(SELECT MAX(ROWNUM) FROM TMP);

输出:
STR
'A,B,C,D,E ' 5
--------------------------
传参方式
WITH TMP (NANME,ROWNUM) AS (
SELECT NANME,RANK() OVER(ORDER BY ID) FROM TEMP.DG WHERE PARENT_ID=1
) ,
TMP2(STR,ROWNUM)AS
(SELECT CAST(NANME AS VARCHAR(100)) ,ROWNUM FROM TMP WHERE ROWNUM=1
UNION ALL
SELECT STR|| ', '||A.NANME , A.ROWNUM FROM TMP A ,TMP2 B WHERE A.ROWNUM=B.ROWNUM+1)
SELECT * FROM TMP2 WHERE ROWNUM=(SELECT MAX(ROWNUM) FROM TMP);
输出:
STR:
'B,D ' 2

其中TEMP.DG 就是你的表名,把上面算法加到你的函数中就OK了,函数怎么写不用我教吧,自己体会体会!


------解决方案--------------------------------------------------------
如果你有mssql wrapper的话就不用这么麻烦了。
只需在db2本地声明一个函数模板,然后做一个function mapping就可以了。

------解决方案--------------------------------------------------------
不过那种方法只能用来处理sql server的数据。
  相关解决方案