Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在一个查询中调整多个条件?_Sql_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

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
您将不会获得任何记录。