0
select regexp_replace((select regexp_substr(reference_number, '[^|]+', 1, level), 
                       reference_number 
                       from ups_ship1 
                       connect by regexp_substr(reference_number, '[^|]+', 1, level) 
                           is not null), '(\D+)', '') 
from ups_ship1;
4

2 回答 2

2

有点难以理解您要做什么,但是您不能将返回许多行(带有 2 列)作为第一个参数的子查询的结果发送到regexp_replace.

您可以像这样在 FROM 子句中使用子查询:

select regexp_replace(rn, '(\D+)', '') 
from (select regexp_substr(reference_number, '[^|]+', 1, level) rn, 
                       reference_number 
                       from ups_ship1 
                       connect by regexp_substr(reference_number, '[^|]+', 1, level) 
                           is not null) up;

这是一个 sqlfiddle 演示

于 2013-05-30T08:51:00.420 回答
1

很难说没有任何数据,但根据您之前的问题和Ben 的回答,您将两列(您计算的提取值和原始管道分隔的字符串)传递到regexp_replace- 这给出了 ORA-00913 - 并且regexp_substr()正在返回多行,这也是错误的。

我想你想要这个:

select reference_number, regexp_replace(val, '(\D+)', '')
from (
    select regexp_substr(reference_number, '[^|]+', 1, level) val, 
        reference_number 
        from ups_ship1 
        connect by regexp_substr(reference_number, '[^|]+', 1, level) is not null
);

SQL Fiddle 基于您上一个问题的示例数据,尽管它没有任何触发替换的数据。

于 2013-05-30T08:52:09.943 回答