我有一个查询必须根据文本行中使用的某些关键字从文本字段中过滤我们的结果..目前SQL语句如下所示。
and (name like '%Abc%') or (name like '%XYZ%') or (name like '%CSV%')...
有没有办法避免多个或语句并获得相同的结果?
答案 0 :(得分:0)
如果您有大量不同的模式,那么执行此操作的稍微简单方法是使用EXISTS
和table 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))