我的弦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
如果您希望将所有这些都放在一个列中,那么您需要使用我在此处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>
正如你所看到的,这些都是非常可怕的,除了第一个,效率非常低。您应该正确规范您的数据库,以确保您不必这样做。