56

在子句中包含输入参数WHERE但如果它为空则将其排除的最佳方法是什么?

我相信有很多方法,但我当时似乎不记得了。

我也可以使用COALESCE()吗?但我认为这仅适用于选择值?

编辑

为了澄清,假设一个名为@code ="1"then my where的变量,Where type='B' AND code = @code但如果@code is null那时我只想Where type='B'- 注意缺少的code = @code.

4

7 回答 7

90

您可以使用IsNull

 where some_column = IsNull(@yourvariable, 'valueifnull')

编辑

您在评论中描述的内容可以这样做:

where (@code is null or code = @code)
于 2010-11-19T12:35:31.520 回答
11

这是另一种方法

SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
于 2010-11-19T12:38:34.897 回答
11

怎么样

WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
于 2010-11-19T12:39:12.213 回答
5

我想提出一个我在另一个网站上找到的解决方案:

SELECT * FROM Thingies 
WHERE ThingID = isnull(@ThingId,ThingID)

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

于 2012-08-14T01:29:48.480 回答
5

这个问题确实帮助我解决了一个类似的问题,这让我们中的一些人有些摸不着头脑。我只写它以防其他人尝试相同的方法并且无法弄清楚为什么它不起作用。

如果@Parameter 不为空,我试图仅评估多部分 WHERE 子句的一部分。我尝试如下执行此操作,但如果 @Parameter 为空,则始终没有返回任何行。

DECLARE @Parameter int = null;

SELECT  *  FROM  TABLE
WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter)

我错误地认为(@Parameter is not null AND [AlternateID] = @Parameter)@Parameter 为 null 不会构成完整 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])    
于 2014-03-24T10:28:31.783 回答
1

您可以使用 ISNULL(),或者像其他人提到的那样明确检查空值。只要您有不超过 1 或 2 个可选输入参数,这应该没问题。但是如果有更多参数,这种方法将非常低​​效,因为您在这些列上创建的索引不会像您期望的那样使用。在这种情况下,我建议您使用动态 SQL。这是一篇很好的文章,解释了为什么http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

于 2010-11-19T15:29:23.943 回答
0

我认为这会有所帮助

@id 
@name

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

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

于 2020-06-09T14:17:05.403 回答