是否有可能在 Microsoft SQL 中避免使用多个 "OR" 语句?
Is there a possibility to Avoid multiple "OR" statement in Microsoft SQL?
我有一个查询必须根据文本行中使用的某些关键字从文本字段中过滤我们的结果。目前 SQL 语句如下所示。
and (name like '%Abc%') or (name like '%XYZ%') or (name like '%CSV%')...
有没有办法避免多次or语句,达到相同的结果?
如果您有大量不同的模式,稍微多 shorthand 的方法是使用 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;
您可以将过滤器关键字放入 table 或临时 table 并像这样查询它们:
select a.*
from table_you_are_searching a
inner join temp_filter_table b
on charindex(b.filtercolumn,a.searchcolumn) <> 0
只是为了给你另一个选择,你也可以试试这个,一个 IN 语句与一个 PATINDEX 混合:
Select *
from tbl
Where 0 not in (PATINDEX('%Abc%', name), PATINDEX('%XYZ%', name), PATINDEX('%CSV%', name))
我有一个查询必须根据文本行中使用的某些关键字从文本字段中过滤我们的结果。目前 SQL 语句如下所示。
and (name like '%Abc%') or (name like '%XYZ%') or (name like '%CSV%')...
有没有办法避免多次or语句,达到相同的结果?
如果您有大量不同的模式,稍微多 shorthand 的方法是使用 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;
您可以将过滤器关键字放入 table 或临时 table 并像这样查询它们:
select a.*
from table_you_are_searching a
inner join temp_filter_table b
on charindex(b.filtercolumn,a.searchcolumn) <> 0
只是为了给你另一个选择,你也可以试试这个,一个 IN 语句与一个 PATINDEX 混合:
Select *
from tbl
Where 0 not in (PATINDEX('%Abc%', name), PATINDEX('%XYZ%', name), PATINDEX('%CSV%', name))