Sql 如何在一个查询中调整多个条件?
请参见,我可以将两个参数传递给程序以过滤我的搜索,即投诉人姓名Sql 如何在一个查询中调整多个条件?,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,请参见,我可以将两个参数传递给程序以过滤我的搜索,即投诉人姓名或投诉主题或(投诉人姓名和投诉主题) 因此,我可以在这个仅适用于投诉人姓名的查询中进行调整吗 @ComplainantName varchar(100), @ComplaitSubject varchar(MAX) Select * from ComplaintsInfo where ComplainantName= @ComplainantName 我很幼稚,试图把它分类 注意:有时两个或其中一个都可以为空,即用户选择仅传递
或
投诉主题或
(投诉人姓名和
投诉主题)
因此,我可以在这个仅适用于投诉人姓名的查询中进行调整吗
@ComplainantName varchar(100),
@ComplaitSubject varchar(MAX)
Select * from ComplaintsInfo
where ComplainantName= @ComplainantName
我很幼稚,试图把它分类
注意:有时两个或其中一个都可以为空,即用户选择仅传递ComplaintSubject,因此在这种情况下,ComplaintName将为”
,您可以使用:
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中选择*,其中ComplaintName类似“%”++@ComplaintName++“%”和COmplaintSubejct类似“%”++@ComplaintSubject++“%”
是的,您可以将complaminantname=@complaminantname
更改为类似“%”+@complaminantname+'%的complaminantname,但您应该知道,以通配符开头的表达式是不可争论的。如果它是该列上的索引,查询优化器将跳过它
Select *
from ComplaintsInfo
where (ComplainantName like '%'+@ComplainantName+'%' OR @ComplainantName IS NULL)
AND (ComplaitSubject like '%'+@ComplaitSubject+'%' OR @ComplaitSubject IS NULL);
你也可以考虑使用<代码>全文索引< /代码>进行字符串搜索。
OK先生,谢谢,我也会尝试这个。我也试过这个,现在看起来很有效,可以吗?选择*from ComplaintsInfo,其中需要处理NULL
/缺少的值,其中ComplaintName(如“%”++@complaintName++“%”和COmplaintSubejct(如“%”++@ComplaintSubject++“%”)。如果用户通过投诉人名称=NULL
您将不会获得任何记录。