SQL查询有时仅能工作的条件
-
30-09-2019 - |
题
我正在基于数据库中的SQL存储过程创建报告(Crystal Reports XI)。查询接受一些参数,并在指定的日期范围内返回记录。如果传递参数,它们将用于确定要返回的记录。如果未传递一个或多个参数,则该字段不用于限制返回的记录类型。有点复杂,所以这是我的从句:
WHERE ((Date > @start_date) AND (Date < @end_date))
AND (@EmployeeID IS NULL OR emp_id = @EmployeeID)
AND (@ClientID IS NULL OR client_id = @ClientID)
AND (@ProjectID IS NULL OR project_id = @ProjectID)
AND (@Group IS NULL OR group = @Group)
现在,出于问题:
查询(和报告)在2000 - 2005年以内的旧数据方面非常出色。但是,近年来,其中的子句未正确过滤数据:它仅返回参数@group为null的记录(即:未传递)。
任何提示,技巧或潜在客户都将受到赞赏!
解决方案
解决了!
毕竟,它实际上与Where子句无关。我让SQL Server为我生成了一个内在的加入,这本来应该是一个左键:近年来的许多记录不包含加入表(费用)中的条目,因此它们没有出现。有趣的是,在费用表中确实有一些条目的近期记录具有零值的零值,这就是为什么我只有在@group为null时才能获得记录的原因。
故事的道德:1。仔细检查任何自动生成的东西; 2.寻找无效的值! (N8WL-感谢您给我仔细观察空的提示。)
其他提示
您的较新数据(2005年后)在EMP_ID,client_id,project _id或group中有一些行的机会是什么?如果它们是空的,则无法匹配您通过的参数。
由于日期和组是保留的单词,因此您可能会尝试在字段上放置方括号,以免处理它们。这样做可以摆脱这样的“奇数”问题。这样就可以了:
WHERE (([Date] > @start_date) AND ([Date] < @end_date))
AND (@EmployeeID IS NULL OR emp_id = @EmployeeID)
AND (@ClientID IS NULL OR client_id = @ClientID)
AND (@ProjectID IS NULL OR project_id = @ProjectID)
AND (@Group IS NULL OR [group] = @Group)
不隶属于 StackOverflow