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


    文章目录
    • 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
    
  • 相关阅读:
    《我想进大厂》之mysql夺命连环13问
    抽象数据类型的表示与实现
    数据结构两个层次——逻辑结构和存储结构
    单链表的两种构造函数
    使用malloc函数或new运算符为链表结点分配内存空间
    基于Vue全家桶开发的前端组件管理平台
    JS菱形镂空
    JS使用for循环实现九九乘法表数字颜色不同
    JS——个人所得税
    JAVA常见关键字
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12256386.html
Copyright © 2020-2023  润新知