Oracle相当于SQL Server STUFF功能?

时间:2010-01-21 09:47:23

标签: oracle select

Oracle是否有自己的SQL Server stuff函数实现?

Stuff允许您从多行选择中接收一个值。请考虑下面的情况

 ID   HOUSE_REF   PERSON
 1      A         Dave
 2      A         John
 3      B         Bob

我想写一个select语句,但我希望PERSON名称在一行中。

例如,当我从这个表中选择时,我想实现以下

HOUSE_REF   PERSONS
A           Dave, John
B           Bob

到目前为止,我还没有找到一个简单的解决方案,可能是编写我自己的函数使用的情况,但我不完全确定如何处理这个,任何想法?

这个的主要业务用途是使用一个选择语句来显示每个房子,并且在那个房子里有一个列,列出住在那个房子里的每个人。此选择中的房屋参考必须是唯一的,因此需要连接人员

由于

4 个答案:

答案 0 :(得分:7)

Oracle 11.2包含一个新功能LISTAGG来执行此操作。

在此之前,您可以使用Tom Kyte's STRAGG function

答案 1 :(得分:2)

您可以编写自定义聚合函数来执行此操作。您生成的此字符串限制为4k字符。

http://www.sqlsnippets.com/en/topic-11591.html

有一个未记录的,不受支持的函数WMSYS.WM_CONCAT来做同样的事情。

http://www.psoug.org/reference/undocumented.html

答案 2 :(得分:1)

“没有加载项/没有未记录的函数”Oracle解决方案(在Tony提到的11.2之前)是:

select c1, ltrim(sys_connect_by_path(c2,','),',') persons
 from
  (
   select c1, c2, 
    row_number() over (partition by c1 order by c2 ) rn
     from
      (
       select house_ref c1, person c2 
        from housetable 
      )
   )
  where connect_by_isleaf=1
  connect by prior rn+1 =rn and prior c1 = c1
  start with rn=1
;

答案 3 :(得分:1)

执行以下三个功能。

功能1

  

创建或替换stragg_type类型为   object(string varchar2(4000),

     

静态功能   ODCIAggregateInitialize       (sctx in out stragg_type)       返回号码,

     

成员函数ODCIAggregateIterate       (自我出局stragg_type,         varchar2中的值       )返回号码,

     

会员功能   ODCIAggregateTerminate       (自我为stragg_type,         returnvalue out varchar2,         标志数量       )返回号码,

     

成员函数ODCIAggregateMerge       (自我出局stragg_type,         stragg_type中的ctx2       )返回号码);

/

功能2

  

创建或替换类型体   stragg_type是

     

静态功能   ODCIAggregateInitialize(sctx in   out stragg_type)返回号码是   开始

sctx := stragg_type( null ) ;

return ODCIConst.Success ;
     

端;

     

成员函数ODCIAggregateIterate   (自我出局stragg_type,       varchar2中的值)返回数字是开始

self.string := self.string || ',' || value ;

return ODCIConst.Success;
     

端;

     

会员功能   ODCIAggregateTerminate(自己   在stragg_type中,       returnvalue out varchar2,       数字中的标志)返回号码开始

returnValue := ltrim( self.string, ',' );

return ODCIConst.Success;
     

端;

     

成员函数ODCIAggregateMerge
  (自我出局stragg_type,       stragg_type中的ctx2)返回数字开始

self.string := self.string || ctx2.string;

return ODCIConst.Success;
     

端;

     

端; /

功能3

  

创建或替换功能stragg(   输入varchar2)返回varchar2
  确定性parallel_enable
  使用stragg_type聚合; /


现在执行三个函数后你可以使用stragg如下

  

示例表:emp名称|工资a   | 100 a | 200 a | 300 b | 400   b | 500 c | 600 c | 700 d
  | 800

     

选择姓名,STRAGG(薪水)为   emp group by name;

<强>输出:

  

a | 100200300

     

b | 400500

     

c | 600700

     

d | 800