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

Oracleでのカンマ区切り値の分割

    私にとって完璧に機能します-

    SQL> WITH dummy_table AS(
      2  SELECT '3862,3654,3828' dummy FROM dual
      3  )
      4  SELECT trim(regexp_substr(dummy,'[^,]+',1,Level)) AS dummycol
      5  FROM dummy_table
      6    CONNECT BY level <= LENGTH(REGEXP_REPLACE(dummy,'[^,]+'))+1
      7  /
    
    DUMMYCOL
    --------------
    3862
    3654
    3828
    
    SQL>
    

    それを達成する方法は他にもたくさんあります。単一のカンマ区切り文字列を行に分割するを読んでください。

    更新 単一の文字列値の代わりに列が使用された場合の重複について。ここで循環ループを取り除くために、PRIOR句でDBMS_RANDOMを使用していることを確認しました

    次のことを試してください

    SQL> WITH dummy_table AS
      2    ( SELECT 1 rn, '3862,3654,3828' dummy FROM dual
      3    UNION ALL
      4    SELECT 2, '1234,5678' dummy FROM dual
      5    )
      6  SELECT trim(regexp_substr(dummy,'[^,]+',1,Level)) AS dummycol
      7  FROM dummy_table
      8    CONNECT BY LEVEL          <= LENGTH(REGEXP_REPLACE(dummy,'[^,]+'))+1
      9  AND prior rn                 = rn
     10  AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
     11  /
    
    DUMMYCOL
    --------------
    3862
    3654
    3828
    1234
    5678
    
    SQL>
    

    アップデート2

    別の方法、

    SQL> WITH dummy_table AS
      2    ( SELECT 1 rn, '3862,3654,3828' dummy FROM dual
      3    UNION ALL
      4    SELECT 2, '1234,5678,xyz' dummy FROM dual
      5    )
      6  SELECT trim(regexp_substr(t.dummy, '[^,]+', 1, levels.column_value)) AS dummycol
      7  FROM dummy_table t,
      8    TABLE(CAST(MULTISET
      9    (SELECT LEVEL
     10    FROM dual
     11      CONNECT BY LEVEL <= LENGTH (regexp_replace(t.dummy, '[^,]+')) + 1
     12    ) AS sys.OdciNumberList)) LEVELS
     13    /
    
    DUMMYCOL
    --------------
    3862
    3654
    3828
    1234
    5678
    xyz
    
    6 rows selected.
    
    SQL>
    


    1. SQLite GLOB

    2. postgreSQLで既存のテーブルのcreatetablesqlステートメントを生成する方法

    3. 50シェードオブNULL–SQLにおけるNULLのさまざまな意味

    4. OLE DBソースコンポーネントのストアドプロシージャパラメータに値を渡すにはどうすればよいですか?