将参数与空值进行比较

时间:2014-04-08 12:45:34

标签: sql sql-server database tsql where-clause

我是SQL的新手,我想知道解决这个小问题的方法

Select * from ApplicationData where ApplicationId = @AppID

AppID可以为null,也可以包含一些值。收到空值时,它返回所有应用程序。我们有什么方法可以改变Where子句。

实施例

Select * from ApplicationData where  Case When <some condition> then
ApplicationId = @AppID else ApplicationId is null;

由于

6 个答案:

答案 0 :(得分:2)

如果您在存储过程中执行此操作,则使用逻辑在两个过滤器要求之间切换。但是,如果在索引中包含ApplicationId列(最好是第一个键),这只会为您提供最佳代码。

IF @AppID IS NULL
BEGIN
    SELECT * FROM ApplicationData
END
ELSE
BEGIN
    SELECT * FROM ApplicationData WHERE ApplicationId = @AppID
END

为什么这是最好的解决方案?因为SQL引擎将为此存储过程创建两个查询计划。查询计划将为您提供两种过滤要求的最佳解决方案。由于它们是小语句而您只需要两个可能的结果,因此您不会对查询缓存造成任何负担,并且您的代码非常易读。如果您的要求更复杂,有许多过滤变化,那么您应该考虑动态SQL。

如果您没有使用存储过程,那么您的应用程序层应该动态创建两个单独的查询字符串。

有很多关于这个主题的文章。如果你需要,我可以为你挖出一些好的。

答案 1 :(得分:0)

试试这个:

SELECT *
FROM ApplicationData
WHERE CASE WHEN @AppID IS NULL THEN ApplicationId IS NULL
           ELSE ApplicationId = @AppID END;

或者,您可以将其分为两个条件:

SELECT * 
FROM ApplicationData
WHERE ApplicationId = @AppID
   OR (ApplicationId IS NULL AND @AppID IS NULL);

答案 2 :(得分:0)

WHERE @AppID IS NULL OR ApplicationId = @AppID;

答案 3 :(得分:0)

这应该有效:

SELECT * FROM ApplicationData
WHERE (ApplicationId IS NULL AND @AppID IS NULL) OR ApplicationId = @AppID

这是另一种方法:

SELECT * FROM ApplicationData 
WHERE ISNULL(ApplicationId, -1) = ISNULL(@AppID, -1)

这些查询(一起运行时)的成本分别为34%/ 66%,因此使用第一个。

答案 4 :(得分:0)

在考虑之前总是先检查你的参数,记住,括号非常重要,特别是对于多个参数

- 单个参数的示例

Select * from ApplicationData where (@AppID IS NULL OR ApplicationId = @AppID)

- 多个参数的示例

Select * from ApplicationData 
where (@AppID IS NULL OR ApplicationId = @AppID)
OR (@AnotherAppID IS NULL OR AnotherApplicationId = @AnotherAppID )

确保您已覆盖您的参数,然后您的查询将正常运行,欢呼=)

答案 5 :(得分:0)

对于你的情况,你应该这样做

IF @AppID IS NULL
BEGIN
   SELECT * FROM ApplicationData WHERE ApplicationId is null
END
ELSE
BEGIN
   SELECT * FROM ApplicationData WHERE ApplicationId = @AppID
END