我是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;
由于
答案 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