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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM