请参阅我可以将2个参数传递给过程以过滤我的搜索,即ComplainantName or
ComplaintSubject or
(ComplainantName AND
ComplaintSubject)
我可以在此查询中调整哪个只适用于 ComplainantName ?
@ComplainantName varchar(100),
@ComplaitSubject varchar(MAX)
Select * from ComplaintsInfo
where ComplainantName= @ComplainantName
我天真并且试图对它进行排序。
注意:有时两者或其中一个可能为空,即用户选择仅传递ComplaintSubject,因此在这种情况下,ComplainantName将为""
答案 0 :(得分:2)
您可以使用:
DECLARE @ComplainantName varchar(100),
@ComplaitSubject varchar(MAX);
Select *
from ComplaintsInfo
where (ComplainantName = @ComplainantName OR @ComplainantName IS NULL)
AND (ComplaitSubject = @ComplaitSubject OR @ComplaitSubject IS NULL);
-- @ComplainantName/Subject = '' if empty string indicates missing value
如果您只想使用一个参数传递第二个作为NULL
进行搜索。
这样您就可以使用以下方法进行过滤:
╔══════════════════╦══════════════════╦═════════════════════════════════════════════════════════════════╗
║ @ComplainantName ║ @ComplaitSubject ║ result ║
╠══════════════════╬══════════════════╬═════════════════════════════════════════════════════════════════╣
║ NULL ║ NULL ║ all ║
║ NULL ║ val ║ records with ComplaitSubject='val' ║
║ val ║ NULL ║ records with ComplainantName='val' ║
║ val1 ║ val2 ║ records with ComplaitSubject='val1' and ComplainantName='val2' ║
╚══════════════════╩══════════════════╩═════════════════════════════════════════════════════════════════╝
修改强>
我也尝试了这个,现在似乎有效,可以吗?从ComplaintsInfo中选择*,其中ComplainantName如'%'+ @ComplainantName +'%'和COmplaintSubejct如'%'+ @ ComplaintSubject +'%'
是的,您可以使用ComplainantName = @ComplainantName
更改ComplainantName like '%'+ @ComplainantName +'%'
,但您应该知道以通配符开头的表达式是nonSARGable。如果它是该列的索引,查询优化器将跳过它。
Select *
from ComplaintsInfo
where (ComplainantName like '%'+@ComplainantName+'%' OR @ComplainantName IS NULL)
AND (ComplaitSubject like '%'+@ComplaitSubject+'%' OR @ComplaitSubject IS NULL);
您还可以考虑使用FULL-TEXT INDEX
进行字符串搜索。