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

正規表現を使用して複数一致文字列をフェッチする方法

    これらすべてをの単一の文字列として使用する場合 標準の REPLACE()

    SQL> select replace('2711393|2711441|1234567', '|', ', ') from dual;
    
    REPLACE('2711393|2711441|
    -------------------------
    2711393, 2711441, 1234567
    

    これらすべてを1つの列にまとめたい場合は、 CONNECT BY 私が示すようにこちら 。これは非常に非効率的であることに注意してください。

    SQL>  select regexp_substr('2711393|2711441|1234567', '[^|]+', 1, level)
      2     from dual
      3  connect by regexp_substr('2711393|2711441|1234567'
      4                           , '[^|]+', 1, level) is not null;
    
    REGEXP_SUBSTR('2711393|2711441|1234567','[^|]+',1,LEVEL)
    --------------------------------------------------------------------------
    
    2711393
    2711441
    1234567
    
    SQL>
    

    これらを異なる列に配置する場合は、を使用する必要があります。 PIVOT そして、あなたはあなたがいくつ持っているかを知る必要があるでしょう。私は3を想定しています。

    SQL> select *
      2    from (
      3   select regexp_substr('2711393|2711441|1234567', '[^|]+', 1, level) as a
      4        , level as lvl
      5     from dual
      6  connect by regexp_substr('2711393|2711441|1234567'
      7                           , '[^|]+', 1, level) is not null
      8          )
      9   pivot ( max(a)
     10          for lvl in (1,2,3)
     11          )
     12         ;
    
    1          2          3
    ---------- ---------- ----------
    2711393    2711441    1234567
    
    SQL>
    

    ご覧のとおり、これらはすべて完全に恐ろしいものであり、最初の非常に非効率的なものを除いてください。これを行う必要がないように、データベースを正しく正規化する必要があります。




    1. ClusterControl1.8.2でPostgreSQL用のPgBouncer接続プールを使用する

    2. 異なるスキーマ上のOracleの同じテーブル名?

    3. 高速テストのためにPostgreSQLを最適化する

    4. サーバーの現在の負荷に影響を与えないようにMySQLダンプを遅くするにはどうすればよいですか?