是否有可能在Microsoft SQL中避免多个“OR”语句?

时间:2015-02-12 16:16:16

标签: sql sql-server sql-server-2008

我有一个查询必须根据文本行中使用的某些关键字从文本字段中过滤我们的结果..目前SQL语句如下所示。

and (name like '%Abc%') or (name like '%XYZ%') or (name like '%CSV%')...

有没有办法避免多个或语句并获得相同的结果?

3 个答案:

答案 0 :(得分:0)

如果您有大量不同的模式,那么执行此操作的稍微简单方法是使用EXISTStable value constructor

SELECT  *
FROM    T
WHERE   EXISTS
        (   SELECT  1
            FROM    (VALUES ('abc'), ('xyz'), ('csv')) m (match)
            WHERE   T.Name LIKE '%' + m.Match + '%'
        );

table valued parameters可以应用类似的方法。由于这通常是人们想要为匹配传递可变数量的搜索词的要求,因此这可能是非常有用的方法:

CREATE TYPE dbo.ListOfString TABLE (value VARCHAR(MAX));

然后程序可以采用这种类型:

CREATE PROCEDURE dbo.GetMatches @List dbo.ListOfString READONLY
AS
BEGIN
    SELECT  *
    FROM    T
    WHERE   EXISTS
            (   SELECT  1
                FROM    @List AS l
                WHERE   T.Name LIKE '%' + l.value + '%'
            );
END

然后你可以调用这个程序:

DECLARE @T dbo.ListOfString;
INSERT @T VALUES ('abc'), ('xyz'), ('csv');
EXECUTE dbo.GetMatches @T;

答案 1 :(得分:0)

您可以将过滤器关键字放入表或临时表中,并按如下方式查询:

select      a.*
from        table_you_are_searching a
inner join  temp_filter_table b
on          charindex(b.filtercolumn,a.searchcolumn) <> 0

答案 2 :(得分:0)

只是为了给你另一个选项,你也可以尝试这个,一个IN语句混合了一个PATINDEX:

Select *
from tbl
Where 0 not in (PATINDEX('%Abc%', name), PATINDEX('%XYZ%', name), PATINDEX('%CSV%', name))