我必须找出在另一个以管道分隔的字符串中找到的输入字符串单词,我正在尝试以下方式,但令人惊讶的是返回“Y”而不是“N”。请让我知道我在下面的演员表中做错了什么陈述。
CASE
WHEN REGEXP_INSTR('TCS|XY|XZ','CS',1,1,1,'i') > 0
THEN 'Y'
ELSE 'N'
END
问候,
拉吉
真的没有必要使用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|
,您可以使用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>> || '(\||$)'
The first field (TCS) contains CS which counts as a match.
If you want to match an entire field you can do like this:
CASE
WHEN REGEXP_INSTR('|' || 'TCS|XY|XZ' || '|' , '\|' || 'CS' || '\|',1,1,1,'i') > 0
THEN 'Y'
ELSE 'N'
END
Add the delimiter to your query string to "anchor" the search to whole fields. To be able to match the first and last field I also added the delimiter to the searched string.