在 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>
說明:
select level from dual connect by level <= regexp_count(t.error, ',')
產生一個數字序列,其長度等於字串中逗號的數量加一(即錯誤的數量)。 table()
和 cast()
函數將分層查詢轉換為數字清單集合,然後轉換為表。這將產生具有遞增數字的行,對應於 TEMP 表中的每一行。 regexp_substr()
函數用於根據上一個步驟中的數字提取單一錯誤值。 trim()
函數刪除任何前導或尾隨空格。 注意: 此解決方案使用 OdciNumberList 類型,如果使用早於 12c 的 Oracle 版本,可能需要指定相容性設定。
以上是如何在 Oracle 中將逗號分隔的字串拆分為多行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!