Oracle中的列转行实现字段拼接用例
- Oracle中的列转行实现字段拼接
场景
在SQL使用过程中经常有这种需求:将某列字段拼接成
in('XX','XX','XX','XX','XX','XX' ...)
做为查询条件。
实现
select 'in ('''||replace(wm_concat(EMPNO),',',''',''')||''')' from EMP
总结
- 两端字符的拼接
- 这里用
'in ('''
和''')'
分别实现了in ('
和')
的前后拼接,以''')'
为例,其中第一个第四个'
是Oracle中的字符串连接符,第二个'
是一个转义字符,第三个'
才是我们真正被转义的内容。- lpad()、rpad()在两端字符的填充中较难控制填充字符串长度。
- wm_concat的使用
这里推荐使用LISTAGG()函数,主要因为:
- 在不同的oracle版本中,
WMSYS.WM_CONTACT
返回的数据类型不一致,10G版本中,返回的是字符串类型,11G版本中,返回的是clob类型,Oracle 11gR2和12C上已经摒弃了wm_concat
函数。- LISTAGG()支持自定义分割字符串,默认值为 NULL,而
WMSYS.WM_CONTACT
固定只能用'
拼接,除非使用REPLACE()替换为不同拼接符。
select mgr,'in (''' ||REPLACE(LISTAGG(EMPNO, ',') within group(order by mgr), ',', ''','& 大专栏 Oracle中的列转行实现字段拼接用例#39;') || ''')' from EMP group by mgr
扩展
转义符
'
(单引号)的转义
Select 'test' || '''' from dual;
Select 'test ''' from dual;
- ASCII码实现转义
Select 'Tom' || chr(38) || 'Jerry' from dual; --chr(38)是‘&'的ASCII码
- ESCAPE转义
使用 ESCAPE关键字定义转义符。 在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。
SELECT * FROM t_test tt WHERE tt.t_ch LIKE '%%'; -- 查找全部
SELECT * FROM t_test tt WHERE tt.t_ch LIKE '%_%'; -- 查找全部
SELECT * FROM t_test tt WHERE tt.t_ch LIKE '%/%'; -- 查找含有左斜杠
SELECT * FROM t_test tt WHERE tt.t_ch LIKE '%/%%' ESCAPE '/'; -- 使用/转义,查找含有%的字符
SELECT * FROM t_test tt WHERE tt.t_ch LIKE '%/_%' ESCAPE '/'; -- 使用/转义,查找含有_的字符
LISTAGG函数
- 语法
LISTAGG(aggregate_expression [, 'delimiter' ] ) [ WITHIN GROUP (ORDER BY order_list) ]
- 参数
aggregate_expression:
提供要聚合的值的任何有效表达式(如列名称)。忽略 NULL 值和空字符串。LISTAGG 不支持 DISTINCT 表达式。delimiter:
可选。将分隔串联的值的字符串常数。默认值为 NULL。WITHIN GROUP (ORDER BY order_list):
可选。指定聚合值的排序顺序。
- 返回值
VARCHAR(MAX)。如果结果集大于最大 VARCHAR 大小(64K – 1 或 65535),则 LISTAGG 返回以下错误:
Invalid operation: Result size exceeds LISTAGG limit
Oracle中的列转行实现字段拼接用例的更多相关文章
- Oracle中的列转行例子详解
数据如下:name id张三 1,2,3 要求实现:name id张三 1张三 2张三 3 --创建临时表 create table tmp as(select '张三' name, '1,2,3' ...
- Oracle中对列加密的方法
Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col ...
- Oracle 四种列转行的方法
1. Oracle自带列转行函数listagg: 实例: with temp as( select 'China' nation ,'Guangzhou' city from dual union a ...
- oracle中查看所有表和字段以及表注释字段注释
获取表:select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 selec ...
- kettle中denormalizer(列转行)的使用
转载: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sucre.blog.51cto.com/1084905/1434015 ...
- hive中的列转行和行转列
1.列转行 1.1 相关函数的说明: concat(string1,string,...) //连接括号内字符串,数量不限. concat_ws(separator,string1,string2,. ...
- SQL Server中动态列转行
http://www.cnblogs.com/gaizai/p/3753296.html 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现 ...
- mysql 列转行,合并字段的方法
数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...
- Oracle中查看所有表和字段以及表注释.字段注释
获取表: select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 sele ...
随机推荐
- 吴裕雄--天生自然python TensorFlow图片数据处理:解决TensorFlow2.0 module ‘tensorflow’ has no attribute ‘python_io’
tf.python_io出错 TensorFlow 2.0 中使用 Python_io 暂时使用如下指令: tf.compat.v1.python_io.TFRecordWriter(filename ...
- Java注解基础
0.背景 Java注解--Annotation产生于JDK5.作为code的特殊“标记”,注解可以在编译.类加载.运行时被读取,并执行处理. 开发利用注解在源码中嵌入补充信息,工具(代码分析.开发.部 ...
- is,数据类型补充,set,深浅拷贝
十二.基础数据类型补充: 1.join 可以把列表变成字符串. s = ‘abc’ s1 = s.join(‘非常可乐’) print(s1) #非abc常abc可abc乐abc s = " ...
- [HDU多校]Ridiculous Netizens
[HDU多校]Ridiculous Netizens 点分治 分成两个部分:对某一点P,连通块经过P或不经过P. 经过P采用树形依赖背包 不经过P的部分递归计算 树型依赖背包 v点必须由其父亲u点转移 ...
- selenium登录网银,密码控件输入
尝试登录农行网银,发现带控件的密码输入框怎么都无法输入啊 最后用虚拟键盘实现的 , DD模拟键盘 http://www.ddxoft.com/ 图形验证码识别没过,有时间再继续 需要安装 Tess ...
- day26-socket(server和client通信)
# socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口.它把复杂的TCP/IP协议隐藏到socket #接口的后面,让socket去组织数据,以符合指定的协议. # socket ...
- 系统学习javaweb补充1----HTML常用语句
HTML 常用语句 一.单行文本框语法格式 <input type="text" name="输入信息的名字" value="输入信息的值&qu ...
- CentOS6与CentOS7的启动过程
Linux启动流程CentOS6的启动流程Systemd概述Systemd初始化进程Systemd目标名称systemd服务管理 linux系统的组成:内核+跟文件系统 内核可实现以下功能:进程管理. ...
- Descriptive Measures for Populations|Parameter|Statistic|standardized variable|z-score
3.4 Descriptive Measures for Populations; Use of Samples For a particular variable on a particular p ...
- 关于Java中反射的总结
Java是面向对象的编程语言,万物皆对象,反射技术就是把类声明.类中的字段声明.方法声明.构造函数声明等都看成是对象,从而可以把类中的各个部分拆解出来单独处理,反射技术主要用来编写通用功能,平时编程使 ...