oracle 列转行 LISTAGG和WM_CONCAT

WMSYS.WM_CONCAT: 依赖WMSYS 用户,不同oracle环境时可能用不了,返回类型为CLOB,可用substr截取长度后to_char转化为字符类型

LISTAGG  : 11g2才提供的函数,不支持distinct,拼接长度不能大于4000,函数返回为varchar2类型,最大长度为4000.

 

with temp as(  
  select 'China' nation ,'Guangzhou' city from dual union all 
  select 'China' nation ,'Shanghai' city from dual union all 
  select 'China' nation ,'Beijing' city from dual union all 
  select 'USA' nation ,'New York' city from dual union all 
  select 'USA' nation ,'Bostom' city from dual union all 
  select 'Japan' nation ,'Tokyo' city from dual   
)  
select nation,listagg(city,',') within GROUP (order by nation)   citylist
from temp 
group by nation ;

with temp as(  
 select 500 population, 'China' nation ,'Guangzhou' city from dual union all 
  select 1500 population, 'China' nation ,'Shanghai' city from dual union all 
  select 500 population, 'China' nation ,'Beijing' city from dual union all 
  select 1000 population, 'USA' nation ,'New York' city from dual union all 
  select 500 population, 'USA' nation ,'Bostom' city from dual union all 
  select 500 population, 'Japan' nation ,'Tokyo' city from dual   
)  
select population,  
      nation,  
      city,  
      listagg(city,',') within GROUP (order by city) over (partition by nation) rank  
      from temp 

 

### 回答1: listagg函数和wm_concat都是用于将多个行合并成一个字符串的函数。 listagg函数是Oracle数据库中的一个聚合函数,可以将多个行的某个列的值合并成一个字符串,并且可以指定分隔符。 wm_concatOracle数据库中的一个非官方函数,也可以将多个行的某个列的值合并成一个字符串,但是不支持指定分隔符。 ### 回答2: listagg函数和wm_concat是两种常用于将多个行字符串合并为单个字符串的Oracle SQL函数。这两个函数的作用很相似,但有一些细微的差别。 listagg函数在Oracle 11g版本中引入,可以用来将一列中的多个字符串连接成同一个字符串。它的语法如下: listagg(列名, 连接符) WITHIN GROUP (ORDER BY 排序列) 其中,列名是要连接的列名,连接符用来分隔每个字符串,而排序列用来指定连接后的字符串的排序顺序。(WITHIN GROUP子句中的语法是必需的。) wm_concat函数则是在早期版本的Oracle数据库中使用,例如9i或10g。与listagg函数不同的是,wm_concat函数不支持排序并且没有WITHIN GROUP子句。wm_concat函数的语法如下: wm_concat(列名) 其中,列名是要连接的列名。 由于listagg函数可以指定排序列,因此与wm_concat相比,它更加灵活。这使得listagg函数更适合于需要按照特定顺序连接字符串的情况。然而,在一些Oracle版本中,wm_concat函数比listagg函数执行得更快,所以如果性能是重要的,可能需要测试两种方法并选择性能更好的一个。 需要注意的是,wm_concat函数并不是Oracle官方支持的函数,因此在某些情况下可能不受Oracle支持或者不可用。建议在使用前,先确认它的可用性。 ### 回答3: listagg函数和wm_concat函数在Oracle数据库中都用于将一个列的值连接成一个字符串,但两者有一些不同之处。 listagg函数是Oracle 11g版本后引入的函数,可以将一个列的值连接成一个字符串,并且可以指定一个分隔符。listagg函数支持窗口函数,可以在查询中分组、排序、过滤和聚合结果集。例如,下面的查询将员工按照部门分组,并将每个部门的员工姓名连接成一个以逗号分隔的字符串: ``` SELECT department_name, LISTAGG(employee_name, ',') WITHIN GROUP (ORDER BY employee_name) AS employees FROM employees GROUP BY department_name; ``` wm_concat函数也可以将一个列的值连接成一个字符串,但是它是Oracle 10g之前使用的函数,目前不再被建议使用。这个函数不支持窗口函数,结果也不一定可预测,因为Oracle没有对其进行官方支持。例如,下面的查询将会返回一个以逗号分隔的字符串,其中没有排序和去重: ``` SELECT department_name, WM_CONCAT(employee_name) AS employees FROM employees GROUP BY department_name; ``` 总而言之,listagg函数是Oracle数据库中推荐使用的连接字符串函数,具有更多的功能和可预测的结果。而wm_concat函数已经被弃用,不再被建议使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值