如果不是 Null,则检查输入参数并在 SQL Server 的 where 中使用它
Posted
技术标签:
【中文标题】如果不是 Null,则检查输入参数并在 SQL Server 的 where 中使用它【英文标题】:Checking an input param if not Null and using it in where in SQL Server 【发布时间】:2011-05-12 14:51:02 【问题描述】:在WHERE
子句中包含输入参数但如果它为空则排除它的最佳方法是什么?
我相信有很多方法,但当时我似乎不记得了。
我也可以使用COALESCE()
吗?但我认为这仅适用于选择值?
编辑
为了澄清,假设一个名为 @code ="1"
的变量,那么我的位置将是 Where type='B' AND code = @code
,但如果是 @code is null
,那么我只想要 Where type='B'
- 注意缺少的 code = @code
。
【问题讨论】:
你可以使用 WHERE COALESCE(code =@code,true) 但我不是数据库专家,不确定这个答案有多好:D @Sarief 谢谢,但 TSQL 没有布尔数据类型。它只能使用具有非布尔值的关系运算符,因此很遗憾您的建议不起作用。 【参考方案1】:我认为这会有所帮助
@id
@name
SELECT [Id],[Name] FROM [Person]
WHERE Id = @id and ISNULL(@name, Name)
这将允许您忽略名称条件(如果它为空)
【讨论】:
【参考方案2】:这是另一种方法
SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
【讨论】:
很遗憾,将评估整个表达式。 TSQL 没有捷径可走。不过,你的表达是正确的。【参考方案3】:这个问题确实帮助我解决了一个让我们中的一些人摸不着头脑的类似问题。我只写它以防其他人尝试相同的方法并且无法弄清楚为什么它不起作用。
如果@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)
根本不会构成完整 WHERE 子句的一部分,因为 @Parameter 为空。然而,它使整个 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])
【讨论】:
另一种方法是: WHERE IsNull([AlternateID], 0) = Coalesce((@Parameter, [AlternateID], 0) 然而,为了获得最佳性能,动态 SQL 将是更好的选择,因为索引查找的机会会增加。【参考方案4】:我想提出一个我在另一个 site 上找到的解决方案:
SELECT * FROM Thingies
WHERE ThingID = isnull(@ThingId,ThingID)
使用此解决方案,如果用户选择 null
作为您的参数,那么您的查询将返回所有行作为结果。
【讨论】:
【参考方案5】:您可以使用 ISNULL(),或者像其他人提到的那样明确检查空值。只要您有不超过 1 或 2 个可选输入参数,这应该没问题。但是如果有更多参数,这种方法将非常低效,因为您在这些列上创建的索引不会像您期望的那样使用。在这种情况下,我建议您使用动态 SQL。这是一篇很好的文章,解释了为什么http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/
【讨论】:
【参考方案6】:怎么样
WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
【讨论】:
【参考方案7】:您可以使用IsNull
where some_column = IsNull(@yourvariable, 'valueifnull')
编辑:
你在评论中描述的可以这样做:
where (@code is null or code = @code)
【讨论】:
谢谢,但我的意思是让我们说一个名为 @code ="1" 的变量,那么我的 where 将是 "Where type='B' AND code = @code" 但如果 @code 为空,那么我只想要“Wher type='B'” - 注意缺少的代码 = @code 对于未来的搜索者:您可以使用 some_column 作为 IsNull 的第二个参数where some_column = IsNull(@yourvariable, some_column)
,如果 @yourvariable
为空,则无需过滤即可获取所有查询结果。跨度>
以上是关于如果不是 Null,则检查输入参数并在 SQL Server 的 where 中使用它的主要内容,如果未能解决你的问题,请参考以下文章
SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users