sql >> データベース >  >> RDS >> Oracle

列テキストを行に分割します (括弧内の区切り文字を抽出します) ORACLE SQL

    正規表現 (([^(]*?(\(.*?\))?)*)(,|$) を使用できます 一致する:

    • [^(]*? 0 個以上 (ただしできるだけ少ない数) の開き括弧以外の文字
    • (\(.*?\))? 次に、必要に応じて、開き括弧と、閉じ括弧までのできるだけ少ない文字を指定します。
    • ( )* ゼロ回以上繰り返されるキャプチャ グループにラップ
    • ( ) 一致したアイテム全体を参照できるようにキャプチャ グループにラップ
    • (,|$) コンマまたは文字列の終わりが続きます。

    このように:

    SQL フィドル

    Oracle 11g R2 スキーマのセットアップ :

    CREATE TABLE table_name (ID, カテゴリ) ASSELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(口頭, CNS 、血液)、STO-SE 2(経口、呼吸器への影響)' FROM DUAL;  

    クエリ 1 :

    SELECT ID, l.COLUMN_VALUE AS item, REGEXP_SUBSTR( カテゴリ, '(([^(]*?(\(.*?\))?)*)(,|$)', 1, l.COLUMN_VALUE, NULL, 1 ) AS valueFROM table_name t CROSS JOIN TABLE( CAST( MULTISET( LEVEL BY DUAL CONNECTからレベルを選択   

    結果 :

    <プレ>| ID |アイテム |値 ||----|------|----------------------------------- --|| 1 | 1 | ATD 5(2830) || 1 | 2 | ATO 4(510) || 1 | 3 | EDI 1 || 1 | 4 | || EH A1 || 1 | 5 | || SCI 2 || 1 | 6 | SS1 || 1 | 7 | STO-SE 1(口腔、CNS、血液) || 1 | 8 | STO-SE 2(口腔、呼吸への影響) |


    1. MySQLクロステーブルカウント(*)クエリヘルプ

    2. Java Android AsyncTask+mysql接続

    3. MYSQL-タイムスタンプ値を新しいものから古いものへと昇順で並べ替えますか?

    4. PostgreSQLで複数の列を更新する方法