oracle在输入字符串中搜索单词

时间:2013-10-11 15:39:49

标签: sql oracle

我必须找到在管道分隔的另一个字符串中找到的INPUT字符串单词,我正在尝试下面的方式,但它令人惊讶地返回'Y'而不是'N'。请让我知道我在做错了什么在演员陈述中。

    CASE
      WHEN REGEXP_INSTR('TCS|XY|XZ','CS',1,1,1,'i') > 0
      THEN 'Y'
      ELSE 'N'
    END 

此致

拉​​吉

2 个答案:

答案 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 

将分隔符添加到查询字符串,以将搜索“锚定”到整个字段。为了能够匹配第一个和最后一个字段,我还将分隔符添加到搜索到的字符串中。