Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle在输入字符串中搜索单词_Sql_Oracle - Fatal编程技术网

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

Sql oracle在输入字符串中搜索单词,sql,oracle,Sql,Oracle,我必须找出在另一个管道分隔的字符串中找到的输入字符串单词,我正在尝试下面的方法,但它意外地返回“Y”而不是“N”。请让我知道在下面的cast语句中我做错了什么 CASE WHEN REGEXP_INSTR('TCS|XY|XZ','CS',1,1,1,'i') > 0 THEN 'Y' ELSE 'N' END 问候, Raj第一个字段(TCS)包含CS,CS被视为匹配项 如果要匹配整个字段,可以执行以下操作: CASE WHEN

我必须找出在另一个管道分隔的字符串中找到的输入字符串单词,我正在尝试下面的方法,但它意外地返回“Y”而不是“N”。请让我知道在下面的cast语句中我做错了什么

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

Raj

第一个字段(TCS)包含CS,CS被视为匹配项

如果要匹配整个字段,可以执行以下操作:

CASE
  WHEN REGEXP_INSTR('|' || 'TCS|XY|XZ' || '|' , '\|' || 'CS' || '\|',1,1,1,'i') > 0
  THEN 'Y'
  ELSE 'N'
END 
将分隔符添加到查询字符串中,以“锚定”整个字段的搜索。为了能够匹配第一个和最后一个字段,我还将分隔符添加到搜索的字符串中。

第一个字段(TCS)包含CS,CS作为匹配项

如果要匹配整个字段,可以执行以下操作:

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

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

实际上没有必要使用
regexp\u 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
COL        RES
---------- ---
TCS|XY|XZ| NO
编辑


如果需要考虑竖条-仅当竖条包围着独立的
CS
子字符串时才返回yes,那么可以使用
regexp\u 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        IS_PART
---------  -------
TCS|XY|XZ  Y
TAB|XY|XZ  N
COL        RES
---------- ---
TCS|XY|XZ| NO

注意:如果字符文字是动态的,您可以使用串联运算符
|
来形成搜索模式
'(\| ^)| | | | | |'(\| |$)
,实际上没有必要使用
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
COL        RES
---------- ---
TCS|XY|XZ| NO
编辑


如果需要考虑竖条-仅当竖条包围着独立的
CS
子字符串时才返回yes,那么可以使用
regexp\u 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        IS_PART
---------  -------
TCS|XY|XZ  Y
TAB|XY|XZ  N
COL        RES
---------- ---
TCS|XY|XZ| NO

注意:如果字符文字是动态的,您可以使用串联运算符
|
来形成搜索模式
'(\| ^)| | | | | |'(\| |$)

这是不正确的,请在插入时选择大小写('TCS','CS'))>0然后'Y'else'N'结束,作为DUAL的一部分。这仍然返回'Y'@raj当然它会返回yes,因为
CS
TCS
的一部分。如果什么时候返回是和什么时候返回否有不同的标准,你需要在问题中清楚地说明。我想搜索准确的单词。如果输入字符串是TCS,那么只有它应该返回是。如果输入字符串是“CS”或TC,那么它应该返回否。基本上它应该检查准确的单词。它工作得很好,如何动态地传递字符文本,即CSTHanks,这是有意义的。这是不正确的,当instr('TCS','CS')>0时选择大小写,然后选择“Y”或“N”结束,因为它是DUAL的一部分。这仍然返回“Y”@raj,当然它将返回yes,因为
CS
TCS
的一部分。如果什么时候返回是和什么时候返回否有不同的标准,你需要在问题中清楚地说明。我想搜索准确的单词。如果输入字符串是TCS,那么只有它应该返回是。如果输入字符串是“CS”或TC,那么它应该返回否。基本上它应该检查准确的单词。它工作得很好,如何动态地传递字符文本,即cstanks,这是有意义的。这也是错误的。当REGEXP|u INSTR(“|”|“|”| TCS | XY | XZ”| |“|”|“CS”| |“|”,1,1,'i')>0,然后“Y”ELSE“N”结束返回“Y”,我忘了在正则表达式中反斜杠
。我现在修复了它并尝试了它,它为
CS
返回
N
,为
TCS
返回
Y
。这也是错误的。当REGEXP_INSTR(“|”| |“TCS | XY | XZ”| | |“CS”| |“CS”| |“I”|“I”|时,1,1,'I')。我现在修复并尝试了它,对于
CS
它返回
N
,对于
TCS
它返回
Y