Oracle Query只选择两个' - '之间的文本。人物

时间:2017-06-05 18:57:57

标签: oracle plsql character

我想替换一个列值,只选择两个' - '中的文本。字符。示例:案例1 - 已删除 - 案例已关闭 所以,我想要这样的事情:

原件:

描述

案例1 - 已删除 - 案件已关闭

我想拥有的内容:

描述

删除

我有这个,但我不知道如何在第二个' - '之后删除文本。并在当前列描述

上替换该结果
select SUBSTR(description, INSTR(description, '-') + 1) left_value
from (
    select description
    from all_cases
    );

4 个答案:

答案 0 :(得分:2)

一种可能的方式:

with t(col) as(
select 'Case # - Reason - Bla Bla' from dual union all
select 'Case # - Reason2 - Bla Bla' from dual 
)

select 
substr( 
    col, 
    INSTR (col , '-' , 1, 1)+1,  
    INSTR (col , '-' , 1, 2) - INSTR (col , '-' , 1, 1) - 1
)
from t

答案 1 :(得分:1)

由于INSTR功能允许设置您想要的任何字符的出现,您可以使用它来根据" - "来识别要擦除的部分。字符:

select  trim(
            replace(  
                    replace(
                                description, 
                                SUBSTR(description, 1, INSTR(description, '-',1,1)), -- <-- first occurrence of "-"
                                null), 
                    SUBSTR(description, INSTR(description, '-',1,2), -- <-- second occurrence of "-"
                    length(description)), 
                    null)
        ) as result
from all_cases;

假设您的所有行都遵循相同的模式,则在一次调用中更新所有内容将如下所示:

update all_cases
set description = trim(
                    replace(  
                        replace(description, 
                                SUBSTR(description, 1, INSTR(description, '-',1,1)),
                                null), 
                        SUBSTR(description, INSTR(description, '-',1,2), length(description)), 
                        null)
                    );

根据&#34; - &#34;识别左右片段的行为。字符并用null替换它们。

答案 2 :(得分:0)

我认为你正在寻找这样的东西:

SQL>  variable s1 varchar2(40)
SQL> exec :s1:='Case 1 - Deleted1 - The case is closed';

PL/SQL procedure successfully completed.

SQL> select substr(:s1,instr(:s1,'-')+1,instr(:s1,'-',2)+1) substr_value from dual;

SUBSTR_VALUE
------------------------------
 Deleted1

希望有所帮助。

答案 3 :(得分:0)

使用REGEXP_SUBSTR()避免所有那些乱七八糟的嵌套substr / instr:

SQL> with tbl(str) as (
     select 'Case 1 - Deleted - The case is closed' from dual
   )
   select trim(regexp_substr(str, '-(.*)-', 1, 1, null, 1)) fixed
   from tbl;

FIXED
-------
Deleted

编辑:更改为简化正则表达式并允许虚线内部可能没有空格的情况。