【发布时间】:2020-01-31 17:02:10
【问题描述】:
我正在尝试创建一个存储过程,根据参数不是空字符串,应该将 AND 条件添加到查询中。如果参数为空字符串,则根本不应该添加 AND 条件。我希望匹配使用 LIKE 而不是“=”,如:
DECLARE @searchstring VARCHAR(50);
SET @searchstring = 'hang up';
SELECT *
FROM ContactLog
WHERE CREATED_DATE > '2020-01-01'
AND Brief_Statement LIKE '%' + CASE
WHEN @searchstring != ''
THEN @searchstring
ELSE Brief_Statement
END + '%'
AND Log_Type = 'L';
SET @searchstring = '';
SELECT *
FROM ContactLog
WHERE CREATED_DATE > '2020-01-01'
-- in this case, since @searchString is empty, I'd like to eliminate this next condition altogether
AND Brief_Statement LIKE '%' + CASE
WHEN @searchstring != ''
THEN @searchstring
ELSE Brief_Statement
END + '%'
AND Log_Type = 'L'
我知道如果我使用“=”而不是 LIKE,我可以这样做...
SET @searchstring = '';
SELECT TOP 10 *
FROM ContactLog
WHERE CREATED_DATE > '2020-01-01'
AND Brief_Statement = CASE
WHEN @searchstring != ''
THEN @searchstring
ELSE Brief_Statement
END
AND Log_Type = 'L'
但我不确定使用 LIKE 执行此操作的效果,并希望查询尽可能高效。
有什么好的方法可以做到这一点?
【问题讨论】:
-
dba.stackexchange.com/a/74466/2131 不要试图让一个查询适用于所有情况,因为它可能很糟糕。相反,使 where 子句动态以反映不同的搜索可能性。另外,要小心 SQL 注入
-
当您搜索子字符串(带有前导通配符)时,它不会对性能产生太大影响。要么您返回与其他谓词匹配的所有行,要么您至少需要检查它们以查看它们是否与搜索字符串谓词匹配。它不会对读取的行产生影响
-
根据
ContacLog的大小、结构以及最终您对数据的处理方式,将中间结果转储到临时表然后应用前导通配符可能会更好搜索。测试将证明您或数据库引擎对数据进行子集化是否会更有效
标签: sql-server