检查输入参数是否为空并在SQL Server中的位置使用它

Mar*_*tin 36 sql-server null coalesce where-clause sql-server-2008

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

我相信有很多方法,但我似乎无法记住.

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

编辑

为了澄清,让我们说一个变量,@code ="1"然后我会在哪里,Where type='B' AND code = @code但如果@code is null那时我只想要Where type='B'- 注意缺失code = @code.

Kla*_*sen 68

你可以使用IsNull

 where some_column = IsNull(@yourvariable, 'valueifnull')
Run Code Online (Sandbox Code Playgroud)

编辑:

您在评论中描述的内容可以像:

where (@code is null or code = @code)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我的意思是让我们说一个名为@code ="1"的变量然后我的地方将是"Where type ='B'AND code = @code"但是如果@code为null那么我只想要"Wher type ='B '" - 注意丢失的代码= @code (2认同)
  • 对于未来的搜索者:如果“@yourvariable”为空,您可以使用 *some_column* 作为 IsNull 的第二个参数,“where some_column = IsNull(@yourvariable, some_column)”,以获取所有查询结果而不进行过滤。 (2认同)

Pau*_*lor 9

这是另一种方法

SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
Run Code Online (Sandbox Code Playgroud)

如果参数为NULL,则不会计算OR表达式的其余部分.

  • 遗憾的是,整个表达式都会被计算。TSQL 中没有捷径。不过你的表达是正确的。 (2认同)

Adr*_*der 9

怎么样

WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
Run Code Online (Sandbox Code Playgroud)


DFo*_*k42 6

看看这个整齐的文章在这里.它解释了为什么"where(@param为null或Field = @param)"表现不佳以及使用什么.


小智 5

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

SELECT * FROM Thingies 
WHERE ThingID = isnull(@ThingId,ThingID)
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

DECLARE @Parameter int = null;

SELECT  *  FROM  TABLE
WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter)
Run Code Online (Sandbox Code Playgroud)

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

WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)
Run Code Online (Sandbox Code Playgroud)

当然,Ali 概述的方法(没有足够的声誉来投票)更有效地解决了这个问题。

WHERE   [AlternateID] is not null 
        AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])    
Run Code Online (Sandbox Code Playgroud)