私のひも2711393|2711441|1234567
私のクエリは次のとおりです。
SELECT REGEXP_SUBSTR('2711393|2711441|2711441', '([0-9]{7})') from DUAL;
実際の出力は2711393
.
期待される出力は2711393, 2711441, 2711441
です。
これらすべてを単一の文字列として連続させたい場合は、正規表現を使用する必要はありません。標準を使用できます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>
ご覧のとおり、これらはすべて完全に恐ろしいものであり、最初のものを除いて、非常に非効率的です。これを行う必要がないように、データベースを正しく正規化する必要があります。