如何在一个查询中调整多个条件?

时间:2016-01-10 13:37:23

标签: sql sql-server tsql sql-server-2012

请参阅我可以将2个参数传递给过程以过滤我的搜索,即ComplainantName or ComplaintSubject or(ComplainantName AND ComplaintSubject)

我可以在此查询中调整哪个只适用于 ComplainantName

@ComplainantName varchar(100), 
@ComplaitSubject varchar(MAX)

Select * from ComplaintsInfo
where ComplainantName= @ComplainantName 

我天真并且试图对它进行排序。

注意:有时两者或其中一个可能为空,即用户选择仅传递ComplaintSubject,因此在这种情况下,ComplainantName将为""

1 个答案:

答案 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进行字符串搜索。