首頁 > 資料庫 > mysql教程 > 如何在 Oracle 中將逗號分隔的字串拆分為多行?

如何在 Oracle 中將逗號分隔的字串拆分為多行?

Susan Sarandon
發布: 2025-01-22 17:51:12
原創
505 人瀏覽過

How to Split Comma-Separated Strings into Multiple Rows in Oracle?

在 Oracle 中拆分逗號分隔的字串到多行

在 Oracle 中,您可以結合使用正規表示式和分層查詢將逗號分隔的字串拆分為多行。以下是如何實現此目標的完整指南:

問題陳述:

假設有一個表格具有以下結構:

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1, Err2, Err3
109  | test2   | Err1</code>
登入後複製

您希望將「錯誤」欄位轉換為多行,結果如下:

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1
108  | test    | Err2
108  | test    | Err3
109  | test2   | Err1</code>
登入後複製

解:

<code class="language-sql">with temp as (
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= regexp_count(t.error, ',')) as OdciNumberList)) levels
;</code>
登入後複製

說明:

  1. 建立臨時表: 建立 TEMP 表以儲存範例資料。
  2. 使用分層查詢: 子查詢 select level from dual connect by level <= regexp_count(t.error, ',') 產生一個數字序列,其長度等於字串中逗號的數量加一(即錯誤的數量)。
  3. 強制型別轉換和表格: table()cast() 函數將分層查詢轉換為數字清單集合,然後轉換為表。這將產生具有遞增數字的行,對應於 TEMP 表中的每一行。
  4. 提取錯誤值: regexp_substr() 函數用於根據上一個步驟中的數字提取單一錯誤值。 trim() 函數刪除任何前導或尾隨空格。
  5. 連接和選擇: 主查詢將 TEMP 表與步驟 4 中建立的表連接,並選擇相應的列:名稱、項目和錯誤。

注意: 此解決方案使用 OdciNumberList 類型,如果使用早於 12c 的 Oracle 版本,可能需要指定相容性設定。

以上是如何在 Oracle 中將逗號分隔的字串拆分為多行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板