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

如果您希望将所有这些都放在一个列中,那么您需要使用我在此处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 回答