【问题标题】:Using REGEXP_SUBSTR with Strings Qualifier将 REGEXP_SUBSTR 与字符串限定符一起使用
【发布时间】:2017-04-30 12:49:46
【问题描述】:

从类似的 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),而不是单独的表达式(PLE)

SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^PLE]+',1,1) from dual;

如何在不使用大量 INSTR 和 SUBSTR 的情况下做到这一点?

谢谢。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案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
    

    【讨论】:

    • 字符串中是否可以多次出现PLE?如果是这样,您是否只想提取子字符串直到第一次出现?
    • 是的,这是可能的。我现在正在测试,发现我的数据至少包含两个 PLE 字。
    • 嗨,我在stackoverflow.com/questions/41156391/… 有一个相关的问题。
    【解决方案2】:

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

    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
    

    【讨论】:

    • 实际上,这是我目前的代码,但我发现它“太长”而无法被其他程序员理解。但是测试了您的方法,它实际上要快得多(尽管只有一秒钟左右)。让我重新表述一下这个问题,以便我能画出更好的画面。
    • 任何程序员都无法理解正则表达式中的非贪婪匹配,但无法理解 SUBSTR 和 INSTR。不买...
    • 嗨,我在stackoverflow.com/questions/41156391/… 中有一个相关问题源于此。请看一看。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2016-04-24
    • 1970-01-01
    • 2016-06-17
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多