sql模式匹配以查找空格或字符

时间:2014-03-27 17:18:12

标签: sql regex sql-server-2008-r2

我在SQL Server 2008 R2中工作。我正在创建一个查询来查找一组特定的字符,例如' ACS'但我不想退回包含“非ACS'或者'非ACS' (为什么输入数据的人不能保持一致是超出我的意义)。我想使用正则表达式来保持查询简短。我试过的是:

WHERE ((tblTasks.strTask LIKE '%ACS%' COLLATE Latin1_General_CS_AS) AND (tblTasks.strTask NOT LIKE '%NON[-, ]ACS%' COLLATE Latin1_General_CS_AS))

哪个不起作用。

我试图避免以下WHERE子句:

WHERE ((tblTasks.strTask LIKE '%ACS%' COLLATE Latin1_General_CS_AS) AND ((tblTasks.strTask NOT LIKE '%NON-ACS%' COLLATE Latin1_General_CS_AS) AND (tblTasks.strTask NOT LIKE '%NON ACS%' COLLATE Latin1_General_CS_AS)))

如何找到两个单词/字符集之间的空格或短划线?

如果我能做这样的事情会很酷:

WHERE (tblTasks.strTask LIKE '%^[NON]^[-, ]ACS%' COLLATE Latin1_General_CS_AS)

2 个答案:

答案 0 :(得分:0)

我不知道sql server是否可以使用正则表达式或者是什么引擎(如果有),但是 一个现代的引擎将能够做到这个正则表达式。

可以使用像ACS(?<!(?i:Non)[- ]ACS)
这样的lookbehind来完成 具有前瞻性,取决于资格认证中还需要什么。

 #  (?=ACS(?<!Non[- ]ACS))     

 (?=                       # Lookahead to find the 'ACS'
      ACS
      (?<! Non [- ] ACS )       # Inner lookbehind, not 'Non ACS' nor 'Non-ACS'
 )
 # Here, we matched 'ACS'  

如果情况可能是一个因素,即&#39; NON&#39;,只需将其作为不区分大小写的范围,&#39; ACS&#39;仍然是强制上限。

(?=ACS(?<!(?i:Non)[- ]ACS))

答案 1 :(得分:0)

试试这个:

select * from <table> 
WHERE field LIKE '%ASC%' and field not like '%NON[ ,-]ASC%'


create table #lookfor (theFld VARCHAR(200))
insert into #lookfor 
   values ('ASC'),('NON-ASC'),('NON ASC'),('NON,ASC')

select * from #lookfor   

select * from #lookfor where thefld like '%ASC%'
         and theFld not like '%NON[ ,-]ASC%'

drop table #lookfor