1

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

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

问候,

拉吉

4

2 回答 2

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|,您可以使用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>> || '(\||$)'

于 2013-10-11T16:04:20.047 回答
1

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.

于 2013-10-11T15:46:08.937 回答