将REGEXP_SUBSTR与字符串限定符一起使用

时间:2016-12-15 02:14:34

标签: sql oracle plsql

从类似的Stack Overflow线程获取示例, Remove all characters after a specific character in PL/SQLHow to Select a substring in Oracle SQL up to a specific character?

我想在字符串出现之前只检索第一个字符。

示例:

STRING_EXAMPLE
TREE_OF_APPLES

结果数据集应仅显示STRING_EXAMTREE_OF_AP,因为PLE是我的分隔符

每当我使用下面的REGEXP_SUBSTR时,它只会STRING_,因为REGEXP_SUBSTRPLE视为单独的表达式(P, L and E),而不是单个表达式{{} 1}}。

(PLE)

如果不使用多个INSTR和SUBSTR,我怎么能这样做?

谢谢。

2 个答案:

答案 0 :(得分:1)

您的查询存在的问题是,如果您使用[^PLE],它将匹配P或L或E以外的任何字符。您正在寻找PLE的连续出现。所以,使用

select REGEXP_SUBSTR(colname,'(.+)PLE',1,1,null,1) 
from tablename

这会将子字符串返回到字符串中最后一次出现的PLE。

如果字符串包含多个PLE实例,并且只需要提取第一次出现的子字符串,请使用

select REGEXP_SUBSTR(colname,'(.+?)PLE',1,1,null,1) 
from tablename

答案 1 :(得分:1)

为什么要使用正则表达式?

select substr(colname, 1, instr(colname, 'PLE')-1) from...

会更有效率。

with
     inputs( colname ) as (
       select 'FIRST_EXAMPLE'  from dual union all
       select 'IMPLEMENTATION' from dual union all
       select 'PARIS'          from dual union all
       select 'PLEONASM'       from dual
     )
select colname, substr(colname, 1, instr(colname, 'PLE')-1) as result
from   inputs
;

COLNAME          RESULT
--------------   ----------
FIRST_EXAMPLE    FIRST_EXAM
IMPLEMENTATION   IM
PARIS   
PLEONASM