如何在需要使用通配符的列中搜索多个值?

时间:2012-05-25 03:07:56

标签: sql-server select

在SQL Server中,我需要在列中搜索多个值,但是我没有确切的值,所以我也需要使用通配符。

我当前的查询如下所示:

SELECT * 
FROM table 
WHERE fieldname in ( '%abc1234%',
                     '%cde456%',
                     '%efg8976%')

这不会返回任何结果,但如果我搜索任何一个单独的值,我会找到它,所以我知道它们在那里。如果没有做多个OR,有几百个值有点笨拙,有没有办法做到这一点?

我也有兴趣知道为什么这个查询不起作用,因为没有%'的相同查询工作正常(除了只捕获少数完全匹配的小问题)。

3 个答案:

答案 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

模拟一些语法我确定。

关键是允许值列表成为唯一的参数。