0

私のひも2711393|2711441|1234567

私のクエリは次のとおりです。

SELECT REGEXP_SUBSTR('2711393|2711441|2711441', '([0-9]{7})') from DUAL;

実際の出力は2711393.

期待される出力は2711393, 2711441, 2711441です。

4

1 に答える 1

3

これらすべてを単一の文字列として連続させたい場合は、正規表現を使用する必要はありません。標準を使用できます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>

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

于 2013-05-29T11:55:16.163 に答える