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

Oracle正規表現の最後の出現からの文字列の分割

    異なるキャプチャグループ(ラウンド()で囲まれている)を抽出することにより、ダブルリバースなしでそれを行うことができます 括弧):

    WITH t ( VAL ) AS (
      SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
      SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
    )
    SELECT REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 1 ) AS COL4,
           REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 2 ) AS COL3,
           REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 3 ) AS COL2,
           REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 4 ) AS COL1
    FROM   t
    

    次のコマンドを使用するだけで、正規表現をさらに簡単にすることもできます。

    '^(.+)_(.+)_(.+)_(.+)$'
    

    最初の.+ は貪欲なので、2番目から4番目のキャプチャグループの最小一致に十分な文字列が残るまで、可能な限り一致します。

    ただし、正規表現は必要ありません

    WITH t ( VAL ) AS (
      SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
      SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
    )
    SELECT SUBSTR( val, 1,        pos1 - 1        ) AS col4,
           SUBSTR( val, pos1 + 1, pos2 - pos1 - 1 ) AS col3,
           SUBSTR( val, pos2 + 1, pos3 - pos2 - 1 ) AS col2,
           SUBSTR( val, pos3 + 1                  ) AS col1
    FROM   (
      SELECT val,
             INSTR( val, '_', -1, 1 ) AS pos3,
             INSTR( val, '_', -1, 2 ) AS pos2,
             INSTR( val, '_', -1, 3 ) AS pos1
      FROM   t
    );
    


    1. MySQLテーブルから値をプルして新しい変数を作成しました

    2. フォワードエンジニアリングMySQLワークベンチエラー1064

    3. MySQLが存在しない場所に参加する

    4. node.jsでBookshelf、MySQL、Knexによって2つの日付の間に作成されたオブジェクトを選択します