我想替换一个列值,只选择两个' - '中的文本。字符。示例:案例1 - 已删除 - 案例已关闭 所以,我想要这样的事情:
原件:
案例1 - 已删除 - 案件已关闭
我想拥有的内容:
删除
我有这个,但我不知道如何在第二个' - '之后删除文本。并在当前列描述
上替换该结果select SUBSTR(description, INSTR(description, '-') + 1) left_value
from (
select description
from all_cases
);
答案 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
编辑:更改为简化正则表达式并允许虚线内部可能没有空格的情况。