Oracle数据库数据分组后字符串拼接SQL
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