Oracle テーブル内の複数のカンマ区切り値を重複せずに複数の行に分割する
Oracle テーブル内のデータを扱う場合、多くの場合、これが必要になります。カンマ区切りの値を複数の行に分割します。 CONNECT BY と正規表現を組み合わせて使用すると、これを実現できます。ただし、クエリ結果の重複行を避けることが重要です。
カンマ区切り値を分割するためのクエリ
WITH CTE AS ( SELECT 'a,b,c,d,e' temp, 1 slno FROM DUAL UNION SELECT 'f,g' temp, 2 slno FROM DUAL UNION SELECT 'h' temp, 3 slno FROM DUAL ) SELECT TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)), slno FROM CTE CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+') AND PRIOR slno = slno AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
説明
このクエリは再帰的な WITH 句を使用して共通テーブル式を作成します(CTE) CTE という名前。 CTE は、カンマ区切りの値を含む 3 行のデータで構成されます。
その後、メインの SELECT ステートメントが temp 列から個々の値を抽出します。 TRIM 関数は、値の先頭または末尾の空白を削除するために使用されます。 REGEXP_SUBSTR() 関数は、カンマ区切り文字に基づいて一時列を個別の値に分割します。
CONNECT BY 句は再帰的分割を実行します。これにより、カンマ区切りの各値に一意のレベルが割り当てられるようになります。 PRIOR slno = slno 条件により、各行 (slno) 内でのみレベルが増加することが保証されます。
さらに、PRIOR DBMS_RANDOM.VALUE IS NOT NULL 条件は、重複行の生成を防ぐために使用されます。 DBMS_RANDOM.VALUE は、乱数を返す疑似列です。これを IS NOT NULL と比較することで、重複を排除するランダムな要素を導入します。
最終結果は、複数の行を含むテーブルになり、各行には元のカンマ区切り文字列からの 1 つの値が含まれます。このアプローチでは、重複行を生成せずに値を効果的に分割します。
以上がOracle のカンマ区切り値を重複せずに複数の行に分割する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。