在SQL Server中,我需要在列中搜索多个值,但是我没有确切的值,所以我也需要使用通配符。
我当前的查询如下所示:
SELECT *
FROM table
WHERE fieldname in ( '%abc1234%',
'%cde456%',
'%efg8976%')
这不会返回任何结果,但如果我搜索任何一个单独的值,我会找到它,所以我知道它们在那里。如果没有做多个OR,有几百个值有点笨拙,有没有办法做到这一点?
我也有兴趣知道为什么这个查询不起作用,因为没有%'的相同查询工作正常(除了只捕获少数完全匹配的小问题)。
答案 0 :(得分:12)
使用Fulltext Index查看。这应该可以更好地完成您的搜索,并使您的“OR”问题成为 little 更好的启动:
SELECT *
FROM table
WHERE CONTAINS(fieldname, '"abc1234" OR "cde456" OR "efg8976"')
另见:
http://www.simple-talk.com/sql/learn-sql-server/full-text-indexing-workbench/
答案 1 :(得分:4)
查询不起作用的原因是它在parens中的值列表中查找fieldname
的完全匹配。它不会在考虑通配符的情况下进行LIKE
比较。
所以你的查询相当于:
SELECT * from table
where fieldname = '%abc1234%' OR
fieldname = '%cde456%' OR
fieldname = '%efg8976%'
显然不是你想要的。
答案 2 :(得分:2)
select table.* from (
table join ( select * from values
( ('%abc1234%'), ('%cde456%'), ('%efg8976%') )
)
as search( exp ) on 0 = 0
) where fieldname like exp
或者
select table.* from
table join
( select * from values (
( '%abc1234%' ), ( '%cde456%' ), ( '%efg8976%' )
) as search( exp )
on fieldname like exp
模拟一些语法我确定。
关键是允许值列表成为唯一的参数。