Oracle数据库数据分组后字符串拼接SQL

数据库内字段,需要行转列或列字段拼接时,相关操作

select t.code                        propertyCode,
       TO_CHAR(WM_CONCAT(distinct t.fund)) propertyName,
       listagg(t.fund, ',') within group ( order by t.fund)
from table_name t
where t.endvalidity = date '2199-12-31'
group by t.code;
WM_CONCAT: 
	1. 支持DISTINCT
	2. 返回值分隔符恒为,
	3. 在PLSQL环境中,WM_CONCAT使用distinct会报错
	4. 没法排序
	5. 官方并不推荐使用WM_CONCAT函数,因此尽量少用
LISTAGG:
	1. 不支持DISTINCT
		解决方法:
			①.先distinct,结果再listagg
			②.自定义聚合函数来取代listagg函数
	3. 返回值的分隔符可以自定义
	4. 返回值类型是VARCHAR2
	5. listagg能满足的情况下,用listagg,不要用wm_concat
自定义聚合函数:

附:当数据拼接时,如果超过4000字符(超过VARCHAR2范围),会报错,处理方法

-- xmlagg函数需要将输入的值转换为xml,处理返回结果也是xml,最后再用getclobval()获取colb类型的结果。
-- xmlagg(xmlelement(表名, 输入值1,输入值2) order by 参数).extract('//text()').getclobval()
select replace(rtrim(xmlagg(XMLELEMENT(ID, 'TABLENAME-第一段内容', ' 分隔符(会被trim)')
    .EXTRACT('//text()')).GetClobVal(), ' '), '&' || 'apos;', '''')
       replace(rtrim(xmlagg(XMLELEMENT(ID, 'WHEREINFO-第二段内容', ' ')
    .EXTRACT('//text()')).GetClobVal(), ' '), '&' || 'apos;', '''')
       replace(rtrim(xmlagg(XMLELEMENT(ID, 'WHEREINFO_ORA-第三段内容', ' ')
    .EXTRACT('//text()')).GetClobVal(), ' '), '&' || 'apos;', '''')
from tableName
where ID = 'myId';
        # 数据库
        # oracle
      
  • 浏览量 706
  • 收藏 0
  • 0

所有评论(0)

加载更多