oracle中自定义聚合函数及用法

也是比较老套的话题了 呵呵
表A                           表B
p_id     p_name              r_id   r_name  r_p_id
1001    测试项目1            100   中标单位1  1001
1002    测试项目2            101   中标单位2  1001
                                    103   中标单位3   1001
                                    103   中标单位1   1002
                                    103   中标单位2   1002
有时候我们需要得到类似下面的列表
1001 测试项目1   中标单位1/中标单位2/中标单位3 
1001 测试项目2   中标单位1/中标单位2
先创建一个函数
   CREATE OR REPLACE FUNCTION  STRCAT ( str_in in varchar2 )--分类字段
   return varchar2
is
      str_list  varchar2(4000) default null;--连接后字符串
      str  varchar2(20) default null;--连接符号
begin
      for x in ( select r_name   from B where r_p_id= str_in ) loop
          str_list := str_list || str || to_char(x.r_name);
          str := '/';
      end loop;
      return str_list;
end;


下面取列表
select p_id,p_name ,STRCAT(p_id) as hitBiders from A
也可以 select p_id,p_name ,(select STRCAT(p_id)  from dual) as hitBiders from A
当然建议用第一个语句
若是在SQL SERVER里可以象下面这样写
create   function   dbo.str_cat(@id   int)
returns   varchar(3000)
as
begin
    declare   @s   varchar(8000)
    select   @s   =   ' '
    select   @s   =   @s   +   r_name   +   '/ '     from   b   where   r_p_id   =   @id
    return   left(@s,len(@s)-1)    
end
或者
create   function   dbo.str_cat(@id  int)
    returns   varchar(3000)
as  
    begin
          declare   @sql   varchar(8000)
          set   @sql= ' '
          select   @sql=@sql+ '/ '+ r_name  from   b   where   r_p_id =@id
          return   stuff(@sql,1,1, ' ')
    end
go







原文地址:https://www.cnblogs.com/peaceli/p/1060814.html