6

在 SQL Server 中,我需要在一列中搜索多个值,但我没有确切的值,因此我还需要使用通配符。

我当前的查询如下所示:

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

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

我也很想知道为什么这个查询不起作用,因为没有 % 的同一个查询工作得很好(除了只捕获几个完全匹配的小问题)。

4

3 回答 3

16

看看使用全文索引。这应该对您的搜索做得更好,并使您的“OR”问题更好地启动:

SELECT * 
FROM table 
WHERE CONTAINS(fieldname, '"abc1234" OR "cde456" OR "efg8976"')

也可以看看:

http://www.simple-talk.com/sql/learn-sql-server/full-text-indexing-workbench/

于 2012-05-25T03:13:01.547 回答
4

查询不起作用的原因是它fieldname在括号中的值列表中寻找完全匹配的值。它不会LIKE在考虑通配符的情况下进行比较。

所以你的查询相当于:

SELECT *  from table  
where  fieldname  = '%abc1234%' OR
       fieldname  = '%cde456%' OR        
       fieldname  = '%efg8976%' 

显然不是你想要的。

于 2012-05-25T03:13:35.430 回答
3
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

模一些语法我敢肯定。

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

于 2012-05-25T03:24:05.830 回答