对表格字段进行合并
前言
在很多时候,我们会需要对查询出来的数据进行连接字符串的 + 操作.
一般来说,这一点在业务代码中实现会更方便一些.
这里,我要说的是如何使用SQL语句进行字段的合并拼接.
试验的数据样式
首先,我们需要一串数据库的数据:一张 student 表:idclassstudent_namestudent_idstudent_from11张一1河南
21张四2福建
32王五1北京
41赵三3新疆
52孙二2南京
62李六3河北
进行数据的拼接
好了,现在我们的数据库有了一张学生表,表里有班级,学生姓名,学号,和生源地.
现在我们需要获得这张表的数据:
select * from student;idclassstudent_namestudent_idstudent_from11张一1河南
21张四2福建
32王五1北京
41赵三3新疆
52孙二2南京
62李六3河北
进行列的拼接
可是如我我们需要讲除了班级的学生信息全部显示在一行并以 // 隔开要怎么做呢?
我们只要这样:
select s.class,(s.student_name||'//'||s.student_id||'//'||s.student_from) about from student s;
就能获得:classabout1张一//1//河南
1张四//2//福建
2王五//1//北京
1赵三//3//新疆
2孙二//2//南京
2李六//3//河北
那么我们是怎么做到的呢,正是 ||'//'|| ,我们用这个符号把列数据进行合并.
其中的关键则是: || ,JAVA语言中其名称为逻辑“或”,在SQL中则用来连接两个字符串连接符。
sql: s.student_name||'//'||s.student_id||'//'||s.student_from
那么,这句话翻译成java则是:
java: s.student_name+"//"+s.student_id+"//"+s.student_from
进行行的拼接 wm_concat()函数
好了,我们现在把每一列的数据整合在一起了,大功告成,可喜可贺.
这是,项目经理过来了,表示这样不行(改需求),我要把一整个班的所有学生数据在一行都显示出来.
大概是这样:classabout1张一//1//河南,赵三//3//新疆,张四//2//福建
2王五//1//北京,李六//3//河北,孙二//2//南京
我们已经把每一列的数据整合到一起了.现在,我们要对行进行处理了.
这时,我们要用到一个sql函数:wm_concat
这是一个聚合函数,其作用是将一列数据转换成一行
select s.class,wm_concat(s.student_name||'//'||s.student_id||'//'||s.student_from) about from student s
这时我们会发现报错了:
ORA-00937: 不是单组分组函数
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
行 1 列 8 出错
这是因为我们只把后面一个列进行整合了,而没有对第一列的数据 class 进行操作,这时我们只需要最语句最后加上一句: group by s.class 就会自动按照班级进行自增排序.
sql语句:
select s.class,wm_concat(s.student_name||'//'||s.student_id||'//'||s.student_from) about from student s group by s.class;
扩展,REPLACE()函数
我们很好的又完成了任务,这时又改需求了.
项目经理说,不能用逗号连接啊,我们要用~来连接每一行.
这时我们需要用到 REPLACE() 这个函数,也就是正则
使用REPLACE()将其中的逗号, 替换为 ~ 就可以了
sql语句:
select s.class,replace(wm_concat(s.student_name||'//'||s.student_id||'//'||s.student_from),',','~') about from student s group by s.class;
结果:classabout1张一//1//河南~赵三//3//新疆~张四//2//福建
2王五//1//北京~李六//3//河北~孙二//2//南京