我在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)
答案 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