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

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

Patricia Arquette
發布: 2025-01-22 17:56:13
原創
636 人瀏覽過

How Can I Split a Comma-Delimited String into Multiple Rows in Oracle 10g and 11g?

在 Oracle 10g 和 11g 中有效地將逗號分隔的字串拆分為行

Oracle 提供了多種將逗號分隔的字串拆分為單獨行的方法。這種改進的方法利用正規表示式和 CONNECT BY 子句來提供更有效的解決方案:

<code class="language-sql">WITH temp AS (
    SELECT 108 AS Name, 'test' AS Project, 'Err1, Err2, Err3' AS 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 <= LENGTH(REGEXP_REPLACE(t.error, '[^,]+')) + 1) AS OdciNumberList)) levels</code>
登入後複製

詳細說明:

此查詢使用分層查詢來實現字串拆分。 讓我們分解一下步驟:

  1. 範例資料: WITH 子句定義包含逗號分隔的錯誤字串的範例表 (temp)。

  2. 分隔符號計數: LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1 計算逗號的數量加一(以考慮最後一個元素)。這決定了所需的行數。

  3. 產生序列: SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= ... 產生從 1 到元素計數的數字序列。 CONNECT BY 對於建立此序列至關重要。

  4. 集合建立: MULTISET(...) 根據產生的序列建立一個集合(一組數字)。 CAST(... AS OdciNumberList) 將其轉換為 Oracle 集合類型。

  5. 表格轉換: TABLE(...) 將集合轉換為結果集,讓我們與 temp 表格連接起來。

  6. 字串擷取: REGEXP_SUBSTR(t.error, '[^,] ', 1, levels.column_value) 擷取每個以逗號分隔的子字串。 [^,] 是符合一個或多個非逗號字元的正規表示式。 levels.column_value 提供提取的出現次數。

  7. 修剪和重複資料刪除: TRIM(...) 刪除前導/尾隨空格。 SELECT DISTINCT 消除重複行,確保每個錯誤只出現一次。

這種方法非常高效,因為它避免了循環並利用 Oracle 的內建函數來最佳化效能。 正規表示式提供了一種強大的方法來處理不同的字串長度和逗號分隔資料中潛在的不規則性。

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

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