Sql server 检查输入参数(如果不为Null)并在SQL Server中的何处使用它

Sql server 检查输入参数(如果不为Null)并在SQL Server中的何处使用它,sql-server,sql-server-2008,null,where-clause,coalesce,Sql Server,Sql Server 2008,Null,Where Clause,Coalesce,在WHERE子句中包含输入参数,但如果输入参数为null则将其排除在外的最佳方式是什么 我相信有很多种方式,但那时我似乎记不起来了 我还可以使用COALESCE()?但我认为这只是为了选择价值观 编辑 为了澄清,让我们假设一个名为@code=“1”的变量,那么我的where将是where type='B'和code=@code,但是如果@code为null,那么我只想要where type='B'-请注意您可以使用的code=@code 编辑: 您在评论中描述的内容可以如下所示: where (

WHERE
子句中包含输入参数,但如果输入参数为null则将其排除在外的最佳方式是什么

我相信有很多种方式,但那时我似乎记不起来了

我还可以使用
COALESCE()
?但我认为这只是为了选择价值观

编辑 为了澄清,让我们假设一个名为
@code=“1”
的变量,那么我的where将是
where type='B'和code=@code
,但是如果
@code为null
,那么我只想要
where type='B'
-请注意您可以使用的
code=@code

编辑

您在评论中描述的内容可以如下所示:

where (@code is null or code = @code)

这是另一种方法

SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
怎么样

WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)

看看这篇整洁的文章。它解释了为什么“where(@param为null或Field=@param)”不能很好地执行,以及使用什么来代替。

您可以使用ISNULL(),或者像其他人提到的那样显式检查null。只要您的可选输入参数不超过1或2个,这应该是正常的。但是如果有更多的参数,这种方法将非常低效,因为您在这些列上创建的索引不会像您预期的那样使用。在这种情况下,我建议您使用动态SQL。这是一篇优秀的文章,解释了为什么我想提出一个解决方案,我在另一个网站上找到了:


使用此解决方案,如果用户为您的参数选择
null
,那么您的查询将返回所有行作为结果。

这个问题确实帮助我解决了一个类似的问题,我们中的一些人对此有些挠头。我只是在其他人尝试同样的方法,无法找出为什么不起作用的情况下才写出来

如果@Parameter不为null,我试图只计算多部分WHERE子句的一部分。我尝试按如下方式执行此操作,但如果@Parameter为null,则始终不会返回任何行

DECLARE @Parameter int = null;

SELECT  *  FROM  TABLE
WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter)
我错误地认为,
(@Parameter不为null,[AlternateID]=@Parameter)
根本不会构成完整WHERE子句的一部分。然而,它使整个WHERE子句返回false。补救措施是添加一个OR 1=1,如下所示:

WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)
当然,阿里提出的方法(声誉不足以提高投票率)更有效地解决了这一问题

WHERE   [AlternateID] is not null 
        AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])    
我想这会有帮助的

@id 
@name

SELECT [Id],[Name] FROM [Person] 
WHERE Id = @id and ISNULL(@name, Name)

这将允许您忽略名称条件,如果它为null

谢谢,但我的意思是让我们假设一个名为@code=“1”的变量,那么我的where将是“where type='B'和code='code',但是如果@code为null,那么我只想要“Wher type='B'”-请注意缺少的code=@code供将来的搜索者使用:如果
@yourvariable
为null,则可以使用some_column=IsNull(@yourvariable,some_column)
作为IsNull的第二个参数来获取所有查询结果,而无需过滤。您可以使用where COALESCE(code=@code,true),但我不是DB guy,不确定这个答案有多好:D@Sarief谢谢,但是TSQL没有布尔数据类型。它只能使用具有非布尔值的关系运算符,因此很遗憾,您的建议不起作用。另一种方法是:WHERE IsNull([AlternateID],0)=Coalesce(@Parameter,[AlternateID],0)但是,为了获得最佳性能,动态SQL将是更好的选择,因为索引查找的机会将增加。遗憾的是,整个表达式都将被计算。TSQL中没有捷径。不过,您的表达式是正确的。
WHERE   [AlternateID] is not null 
        AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])    
@id 
@name

SELECT [Id],[Name] FROM [Person] 
WHERE Id = @id and ISNULL(@name, Name)