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

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. rabbitmq:centos7安装与python调用

    1.centos安装rabbitmq 官网下载或者yum list |grep rabbitmq搜索安装,官网是最新的版本 wget http://www.rabbitmq.com/releases/ ...

  2. I/O模型详细解析

    内核空间和用户空间:由于操作系统都包括内核空间和用户空间(或者说内核态和用户态),内核空间主要存放的是内核代码和数据,是供系统进程使用的空间.而用户空间主要存放的是用户代码和数据,是供用户进程使用的空 ...

  3. PE文件详解(九)

    本篇文章转载自小甲鱼的一篇日志,原文地址 我们知道,Windows 将程序的各种界面定义为资源,包括加速键(Accelerator).位图(Bitmap).光标(Cursor).对话框(Dialog ...

  4. SAP Cloud for Customer(C4C)和微信集成系列教程

    这个系列主要从技术层面阐述了如何实现end user在微信app里发送的message能够投递到C4C系统,以及在C4C系统基于微信发送过来的message回复之后,如何将这些回复再push回微信ap ...

  5. 14.7.1.2 MySQL创建用户句法

    14.7.1.2 CREATE USER Syntax 单击此处查看原文 以下是MySQL 5.7.6及以上版本的CREATE USER句法 CREATE USER [IF NOT EXISTS] u ...

  6. 基于 Webpack 引入 jquery 插件的笔记

    如果都是基于 webpack(npm 上有包),那就非常顺利: import $ from 'jquery' import 'jquery-modal/jquery.modal.min.css' im ...

  7. LVS集群之原理及概述(1)

    一. 概述 什么是集群,集群的特点.功能和分类.Linux环境下用哪些开源软件来构建一个功能强而有稳定的集群系统.了解国人内核级负载均衡开源项目linux虚拟服务器,简称LVS. 1.1 定义 集群是 ...

  8. 阿里云云虚拟主机安装Z-BlogPHP

    简介 在阿里云买了一个云虚拟主机,叫共享虚拟主机普惠版,6 块钱一年.本着练习上手的目的,尝试在阿里云云虚拟主机上安装Z-BlogPHP,一个个人建站的CMS 系统. 云虚拟主机网页空间为200M,M ...

  9. 共60课:Python基础教程

    简介: 你会看到一堆下载链接.我们就选"Python 2.7.5 Windows Installer",如果是64位系统的同学选下面那个"Python 2.7.5 Win ...

  10. deeplearning.ai 人工智能行业大师访谈 Geoffrey Hinton 听课笔记

    1. 怀揣着对大脑如何存储记忆的好奇,Hinton本科最开始学习生物学和物理学,然后放弃,转而学习哲学:然后觉得哲学也不靠谱,转而学习心理学:然后觉得心理学在解释大脑运作方面也不给力,转而做了一段时间 ...