今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考。

1 什么是合并多行字符串(连接字符串)呢,例如:

SQL> desc test;
Name Type Nullable Default Comments
------- ------------ -------- ------- --------
COUNTRY VARCHAR2(20) Y
CITY VARCHAR2(20) Y
SQL> select * from test;
COUNTRY CITY
-------------------- --------------------
中国 台北
中国 香港
中国 上海
日本 东京
日本 大阪
要求得到如下结果集:
------- --------------------
中国 台北,香港,上海
日本 东京,大阪

其实网友已经有一个汇总的解决方案了,如下

Oracle 多行记录合并/连接/聚合字符串的几种方法

2 通过自定义函数的方法

这个方法比较灵活,随时可调用该函数,推荐使用,由于原网页代码有误,我这里再贴一遍

--❶
CREATE OR REPLACE FUNCTION strcat (input VARCHAR2)
RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE USING strcat_type;
--❷
create or replace type strcat_type as object
 (
 currentstr ),
 currentseprator ),
 static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number,
 member function ODCIAggregateIterate(self IN OUT strcat_type,value IN VARCHAR2) return number,
 member function ODCIAggregateTerminate(self IN strcat_type,returnValue OUT VARCHAR2, flags IN number) return number,
 member function ODCIAggregateMerge(self IN OUT strcat_type,ctx2 IN strcat_type) return number)

--❸
create or replace type body strcat_type is
 static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number is
 begin
 sctx := strcat_type('',',');
 return ODCIConst.Success;
 end;
 member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN VARCHAR2) return number is
 begin
 if self.currentstr is null then
 self.currentstr := value;
 else
 self.currentstr := self.currentstr ||currentseprator || value;
 end if;
 return ODCIConst.Success;
 end;
 member function ODCIAggregateTerminate(self IN strcat_type,
 returnValue OUT VARCHAR2, flags IN number) return number is
 begin
 returnValue := self.currentstr;
 return ODCIConst.Success;
 end;
 member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN strcat_type) return number is
 begin
 if ctx2.currentstr is null then
 self.currentstr := self.currentstr;
 elsif self.currentstr is null then
 self.currentstr := ctx2.currentstr;
 else
 self.currentstr := self.currentstr || currentseprator || ctx2.currentstr;
 end if;
 return ODCIConst.Success;
 end;

Oracle多行记录合并自定义函数STRCAT

3 行转列函数,wmsys.wm_concat()、LISTAGG()等

a WMSYS下的东西,一般功能不应该使用,

但我们也可以试试,如果查询出的值提示为CLOB的话,不要惊慌,前面再加一个to_char()就好了,具体参考

oracle合并列的函数wm_concat的使用详解

b 行转列函数listagg()还是不错的

下面这个例子,作者自己构造了一个表进行转换,合并行,当然也可以合并值,但不合并行,具体参考

Oracle 列转行函数 Listagg()

用系统自带的表进行演示下

------语句1
select cc.mgr,listagg(cc.ename,',') within GROUP (order by cc.mgr) from scott.emp cc group by cc.mgr
------语句2 请注意这两句查询结果的不同
select cc.mgr,listagg(cc.ename,',') within GROUP(order by cc.mgr) over (partition by cc.mgr) rank from scott.emp cc

结果如下

结果1

1    7566    FORD,SCOTT
2    7698    ALLEN,JAMES,MARTIN,TURNER,WARD

3    7782    MILLER

4    7788    ADAMS

5    7839    BLAKE,CLARK,JONES

6    7902    SMITH

7        KING

结果2

1    7566    FORD,SCOTT

2    7566    FORD,SCOTT

3    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

4    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

5    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

6    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

7    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

8    7782    MILLER

9    7788    ADAMS

10    7839    BLAKE,JONES,CLARK

11    7839    BLAKE,JONES,CLARK

12    7839    BLAKE,JONES,CLARK

13    7902    SMITH

14        KING

网络资源,原作者可要求删除,谢谢

Oracle多行记录合并的几种方法的更多相关文章

  1. Oracle多行记录合并自定义函数

    在oracle数据库中,进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版 ...

  2. Oracle 多行记录合并/连接/聚合字符串的几种方法

    怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.-什么是合并多行字符串(连接字符串)呢,例如: SQL&g ...

  3. Oracle多行记录合并/连接/聚合字符串的几种方法

    怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.   什么是合并多行字符串(连接字符串)呢,例如:SQL& ...

  4. Oracle多行记录合并处理

    1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( ...

  5. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  6. Oracle中获取执行计划的几种方法分析

    以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下     1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...

  7. oracle多表关联删除的两种方法

    oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...

  8. sql语句实现行转列的3种方法实例

    sql语句实现行转列的3种方法实例 一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理,下面话不多说了,来一 ...

  9. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

随机推荐

  1. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  2. SGML/HTML/XML之间的关系

    1 历史起源 SGML--1986年国际标准化组织出版发布了一个信息管理方面的国际标准(ISO 8879:1986信息处理). HTML 2.0--1995年11月作为RFC 1866发布 XML 1 ...

  3. 转深入理解 AngularJS 的 Scope作用域

    文章转载英文:what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs 中文:http://www. ...

  4. lodash源码分析之List缓存

    昨日我沿着河岸/漫步到/芦苇弯腰喝水的地方 顺便请烟囱/在天空为我写一封长长的信 潦是潦草了些/而我的心意/则明亮亦如你窗前的烛光/稍有暧昧之处/势所难免/因为风的缘故 --洛夫<因为风的缘故& ...

  5. 任务调度框架Quartz原理简介

    [TOC] 第一章 Quartz 1.1 Quartz概念 Quartz是OpenSymphony开源组织的一个Java开源项目, 在2009被Terracotta收购.Quartz官网 1.2 Qu ...

  6. 记录WEUI中滚动加载的一个BUG

    最近写微信公众号,用到的技术栈是jq+vue的混合开发,采用的UI是移动端比较火的WEUI,在微信开发中应该较广泛.个人看惯了elementUI文档,相对于饿了么组件文档的详细,WEUI的文档还是比较 ...

  7. Django----->一周后的重温

    Django   一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来 ...

  8. 有关java里,nextLine()无法输入的问题

    在课后习题中用到了以下代码 public static void main(String[] args) { System.out.print("输入学生人数:"); int st ...

  9. 【JavaScript 实现当前动态时间】

    实现一个简单动态的当前时间 <!doctype html> <html lang="en"> <head> <meta charset=& ...

  10. IntelliJ IDEA 17和Maven构建javaWeb项目

    前言 电脑又断电了,眼看着写好的东西就没有了,这是第二次犯这个错误了.很难受呀!还是回到正题吧,我们来使用IDEA和Maven构建一个JavaWeb项目 软件环境: IDEA:2017.2.1 JDK ...