我必须找到在管道分隔的另一个字符串中找到的INPUT字符串单词,我正在尝试下面的方式,但它令人惊讶地返回'Y'而不是'N'。请让我知道我在做错了什么在演员陈述中。
CASE
WHEN REGEXP_INSTR('TCS|XY|XZ','CS',1,1,1,'i') > 0
THEN 'Y'
ELSE 'N'
END
此致
拉吉
答案 0 :(得分:3)
确实没有必要使用regexp_instr()
正则表达式函数。如果您只需要知道特定字符文字是否是另一个字符文字的一部分,instr()
函数将完全满足您的需求:
with t1(col) as(
select 'TCS|XY|XZ' from dual union all
select 'TAB|XY|XZ' from dual
)
select col
, case
when instr(col, 'CS') > 0
then 'Y'
else 'N'
end as Is_Part
from t1
结果:
COL IS_PART
--------- -------
TCS|XY|XZ Y
TAB|XY|XZ N
修改强>
如果你需要考虑垂直条 - 只有当有一个由垂直条CS
包围的独立|CS|
子字符串时返回yes,然后是,你可以使用regexp_instr()
常规表达函数如下:
with t1(col) as(
select 'TCS|XY|XZ|' from dual
)
select col
, case
when regexp_instr(col, '(\||^)CS(\||$)', 1, 1, 0, 'i') > 0
then 'YES'
else 'NO'
end as res
from t1
结果:
COL RES
---------- ---
TCS|XY|XZ| NO
注意:如果字符文字是动态的,您可以使用连接运算符||
来形成搜索模式'(\||^)' || <<'character literal', column or variable>> || '(\||$)'
答案 1 :(得分:1)
第一个字段(TCS)包含计为匹配的CS。
如果您想匹配整个字段,可以这样做:
CASE
WHEN REGEXP_INSTR('|' || 'TCS|XY|XZ' || '|' , '\|' || 'CS' || '\|',1,1,1,'i') > 0
THEN 'Y'
ELSE 'N'
END
将分隔符添加到查询字符串,以将搜索“锚定”到整个字段。为了能够匹配第一个和最后一个字段,我还将分隔符添加到搜索到的字符串中。