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
到目前为止,我还没有找到一个简单的解决方案,可能是编写我自己的函数使用的情况,但我不完全确定如何处理这个,任何想法?
这个的主要业务用途是使用一个选择语句来显示每个房子,并且在那个房子里有一个列,列出住在那个房子里的每个人。此选择中的房屋参考必须是唯一的,因此需要连接人员
由于
答案 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
来做同样的事情。
答案 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聚合; /
示例表: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