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

Oracleでカンマ区切りの文字列を分割できない

    クエリの問題は、where 句がレベル 1 のみに適用され、それ以上適用されないことです。

    ネストされたテーブルを使用してこれを試してください:

    WITH xtable AS ( SELECT 1 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161,47222' AGT FROM DUAL UNION ALL SELECT 2 ID, '456,789' DUAL AGT FROM UNION ALL SELECT 3 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161' AGT FROM DUAL ) select regexp_substr(x.AGT,'[^,]+', 1, t.column_value) agt from xtable x cross join table( cast( multiset( select level from dual connect by level <=regexp_count(x.AGT,',') + 1 )as sys.odcinumberlist ) ) t where x.id =3;  

    これは、すべてを一度に変換したい場合に where 句がなくても使用できる汎用クエリです。

    Oracle 12c+ では、OUTER APPLY を使用できます。 同じ効果とより単純な構文を実現するには:

    WITH xtable AS ( SELECT 1 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161,47222' AGT FROM DUAL UNION ALL SELECT 2 ID, '456,789' DUAL AGT FROM UNION ALL SELECT 3 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161' AGT FROM DUAL ) select regexp_substr(x.AGT,'[^,]+', 1, t.n) agt from xtable x 外部適用 (レベル <=regexp_count(x.AGT,',') + 1 によるデュアル接続からレベル n を選択) t where x.id =3;   

    1. 2行の時間差-mysql

    2. Postgresの2つの配列から値をテーブルに挿入するにはどうすればよいですか?

    3. SQLServerからデータベースのリストを取得する

    4. SELECTタイプのクエリは、ネストできる唯一のタイプですか?