文章目录

  • Oracle中的列转行实现字段拼接

场景

在SQL使用过程中经常有这种需求:将某列字段拼接成in('XX','XX','XX','XX','XX','XX' ...)做为查询条件。

实现

select 'in ('''||replace(wm_concat(EMPNO),',',''',''')||''')' from EMP

总结

  1. 两端字符的拼接
  1. 这里用'in ('''''')'分别实现了in ('')的前后拼接,以''')'为例,其中第一个第四个'是Oracle中的字符串连接符,第二个'是一个转义字符,第三个'才是我们真正被转义的内容。
  2. lpad()、rpad()在两端字符的填充中较难控制填充字符串长度。
  1. wm_concat的使用

这里推荐使用LISTAGG()函数,主要因为:

  1. 在不同的oracle版本中,WMSYS.WM_CONTACT返回的数据类型不一致,10G版本中,返回的是字符串类型,11G版本中,返回的是clob类型,Oracle 11gR2和12C上已经摒弃了wm_concat函数。
  2. 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) ]
  • 参数
  1. aggregate_expression:
    提供要聚合的值的任何有效表达式(如列名称)。忽略 NULL 值和空字符串。LISTAGG 不支持 DISTINCT 表达式。
  2. delimiter:
    可选。将分隔串联的值的字符串常数。默认值为 NULL。
  3. WITHIN GROUP (ORDER BY order_list):
    可选。指定聚合值的排序顺序。
  • 返回值

VARCHAR(MAX)。如果结果集大于最大 VARCHAR 大小(64K – 1 或 65535),则 LISTAGG 返回以下错误:

  Invalid operation: Result size exceeds LISTAGG limit

Oracle中的列转行实现字段拼接用例的更多相关文章

  1. Oracle中的列转行例子详解

    数据如下:name id张三 1,2,3 要求实现:name id张三 1张三 2张三 3 --创建临时表 create table tmp as(select '张三' name, '1,2,3' ...

  2. Oracle中对列加密的方法

    Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col ...

  3. Oracle 四种列转行的方法

    1. Oracle自带列转行函数listagg: 实例: with temp as( select 'China' nation ,'Guangzhou' city from dual union a ...

  4. oracle中查看所有表和字段以及表注释字段注释

    获取表:select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 selec ...

  5. kettle中denormalizer(列转行)的使用

    转载: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sucre.blog.51cto.com/1084905/1434015 ...

  6. hive中的列转行和行转列

    1.列转行 1.1 相关函数的说明: concat(string1,string,...) //连接括号内字符串,数量不限. concat_ws(separator,string1,string2,. ...

  7. SQL Server中动态列转行

    http://www.cnblogs.com/gaizai/p/3753296.html 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现 ...

  8. mysql 列转行,合并字段的方法

    数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...

  9. Oracle中查看所有表和字段以及表注释.字段注释

    获取表: select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 sele ...

随机推荐

  1. 最大连续子序列(DP)

    Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j < ...

  2. mac 编程环境

    新mac (EI Capitan),需要在python中使用xgboost,通过pip安装未成功. 配置pip cat $HOME/Library/Application\ Support/pip/p ...

  3. scp 碰到的问题

    将 nodejs 的全局目录scp复制到另外一台机器部署代码, 发现运行报错, 提示缺少依赖模块. 检查了很久, 没发现问题. 后来发现,软链接 scp后不再是软链接而是对应文件, 导致相对路径改变!

  4. Qt OpenCV 在界面显示图片 通过Lable方式 和GraphicsView 方式

    1. 通过lable方式打开图片. 代码如下: void MainWindow::on_pushButton_clicked() { Mat srcImage,gray_image,srcImage1 ...

  5. matlab2016b

    http://www.cnblogs.com/CQBZOIer-zyy/p/5933954.html

  6. We don't wanna work!

    We don't wanna work! [JAG Asia 2016] 两个set,一个代表工作的,一个代表不工作的 其实是一个很简单的模拟,但是我竟然排序之前标号.... 检查代码的时候要从头开始 ...

  7. windows10使用npm安装vue、vue-cli

    从网上下载了一个免费的vue.js前端模板,准备和Django整合出一个项目出来,然后发现前端代码都是.vue文件,已经整合过.html,很容易,感觉这个.vue的前端稍微复杂一些 本文主要参考博客及 ...

  8. 没有更好的,五种操作系统助力研发,IMX6开发板做得到

    核心板参数 尺寸 51mm*61mm 四核商业级-2G NXP 四核 i.MX6Q,主频 1 GHz 内存:2GB DDR3:存储:16GB EMMC:SATA接口:支持 双核商业级-1G NXP 双 ...

  9. 21)PHP,杨辉三角

    代码展示: $n=; ;$i<=$n;$i++){ ;$k<=$i;$k++){ ||$k==$i){ $arr[$i][$k]=; }else{ ){ $arr[$i][$k] = $a ...

  10. PAT甲级——1019 General Palindromic Number

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...