欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ORACLE的SQL练习---7. 拼接字符串

程序员文章站 2024-02-13 23:22:16
...

1. 使用||拼接:

||的拼接可以实现两个或者多个字符串的拼接。例如:‘aaa’||‘bbb’||‘ccc’,下面为实际工作中批量更新字段长度的实例

select 'alter table ' || a.TABLE_NAME || ' modify ' || a.COLUMN_NAME || ' ' ||
       a.DATA_TYPE || '(' || a.DATA_LENGTH * 2 || ');'
  from user_tab_columns a
 where a.TABLE_NAME in ('T_DWD_XD_MX')
   and a.DATA_TYPE = 'VARCHAR2'

结果如下:
ORACLE的SQL练习---7. 拼接字符串

2. concat() :

oracle的concat只支持两个字符串的拼接,如果使用多个字符串拼接就要嵌套,用起来很麻烦,所以很少使用。

select concat('AAAA','BBBB' ) from dual;
显示结果:	AAAABBBB

3. listagg()实现多行合并:

下面这个练习实例: 现有各班级选修课程列表,如下图:其中NUM为报名人数
ORACLE的SQL练习---7. 拼接字符串

现期望得到如下结果:
ORACLE的SQL练习---7. 拼接字符串

create table LX_20200218
(
  class_id NUMBER,
  c_name   VARCHAR2(30),
  num      NUMBER
)
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (1, 'Python', 20);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (1, 'java', 16);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (1, 'C++', 5);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (2, 'Python', 31);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (2, 'java', 22);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (3, 'R', 3);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (3, 'Python', 18);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (3, 'java', 11);
 
insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
values (3, 'C++', 5);

答案:

select a.class_id, wm_concat(a.c_name || '(' || a.num || ')' || '人') as 结果
  from lx_20200218 a
 group by a.class_id;

如果oracle升级到12C之后 wm_concat就不能使用了,要换成下面写法,或者自己在12C环境创建该函数

select a.class_id,
       listagg(a.c_name|| '(' || a.num || ')' || '人', ',') WITHIN GROUP(ORDER BY a.c_name) 
  from lx_20200218 a
group by a.class_id