Tsql 参数以查找所有记录或排除NULL

Tsql 参数以查找所有记录或排除NULL,tsql,reporting-services,parameters,Tsql,Reporting Services,Parameters,我发现了几篇关于如何实现与我想用几种方法做的相反的事情的文章,它们是NULL、CASE、COALESCE,但我认为在阅读了所有这些之后,我比以往任何时候都更加困惑,可能使解决方案比需要的更难。我是T-SQL的新手,目前正在使用VS2005构建基本医疗报告 通过使用convert命令忽略时间戳,我使Date Range参数正常工作,该时间戳为我提供了日期或日期范围的所有记录。我现在想按初步报告日期筛选SSRS报告,以查找具有初步报告的记录,或者表中的所有记录 如果未创建初步报告,则数据库为空 如果

我发现了几篇关于如何实现与我想用几种方法做的相反的事情的文章,它们是NULL、CASE、COALESCE,但我认为在阅读了所有这些之后,我比以往任何时候都更加困惑,可能使解决方案比需要的更难。我是T-SQL的新手,目前正在使用VS2005构建基本医疗报告

通过使用convert命令忽略时间戳,我使Date Range参数正常工作,该时间戳为我提供了日期或日期范围的所有记录。我现在想按初步报告日期筛选SSRS报告,以查找具有初步报告的记录,或者表中的所有记录

如果未创建初步报告,则数据库为空 如果创建了初步报告,则数据库具有时间戳。显示创建它的日期和时间 我需要找到所有不为NULL的记录,或者所有记录。使用参数

我只有一个参数显示预调报告@先回答“是”或“否”

如果我使用以下命令,它将正确显示所有记录所有记录不为空仅显示带有预IM报告/时间戳的记录

LIS_Results.Prelim_Report_Date <> '@PrelimOnly' ----User selects YES it passes NULL

在tsql中使用if语句说明参数是否为yes,从条件为true的表中选择记录


如果没有,请从条件为真且日期字段不为空的表中选择记录。

这里有一个小技巧:

((LIS_Results.Prelim_Report_Date <> '@PrelimOnly') OR (1=@AllowNull))
由于@PrelimOnly只能是YES或NO,请使用:


如果参数为否,则满足OR的左侧条件并返回所有行,否则根据需要只返回那些非空行。

是Iiya和Ian的组合让我得到了解决方案,但语法不完整,如下所示

WHERE (@PrelimOnly = 'NO') AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN @ReportStartDate AND @ReportEndDate) OR (LIS_Results.Prelim_Report_Date IS NOT NULL) AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN @ReportStartDate AND @ReportEndDate)
 WHERE (@PrelimOnly = 'NO') AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101)
BETWEEN @ReportStartDate AND @ReportEndDate) OR (LIS_Results.Prelim_Report_Date IS NOT NULL)
AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN @ReportStartDate AND
@ReportEndDate)

它要求重复日期和时间参数,以便这两个参数仍然有效,并且必须首先使用@PrelimOnly='NO'。

在第一个示例中,用户是否需要回答两个问题?我想确保我理解了注释:在第二个示例中,='@PrelimOnly'对条件语句做了什么?是用户回答否,参数通过1例如,条件语句会说1还是?用户应该回答1个问题,其余的逻辑在代码中。在第二个示例中,如果PrelimOnly为空字符串,则它将以其他方式返回所有报告日期不等于prelim valueVS 2005的记录,并将其更改为该值。参数发送NULL或空白。。。无论哪种方式,我都会得到相同的输出,其中LIS_results.Prelim_Report_Date为“NULL”——>其中CONVERTVARCHAR10,LIS_results.Final_Report_Date,101介于ReportStartDate和ReportEndDate之间,以及LIS_results.Prelim_Report_Date与“@PrelimOnly”或CONVERTVARCHAR10,LIS_results.Final_Report_Date不同,101 ReportStartDate和ReportEndDate之间以及开头的“=”@PreliOnly'@PreliOnly=“否”是解决方案的一部分。谢谢你的帮助!不客气!如果答案有助于解决您的问题,请考虑将其设置为接受:它会让我设置两个答案接受吗?实际上是你的回答和IIya的结合让我得到了我需要的答案。。。即使是这样,两个答案中提供的语法也不是完整的解决方案。不幸的是,没有。但接受哪一个仍然完全取决于您-我只是留下了评论,因为您提到它很有帮助。但如果你认为合适的话,你也可以不接受。这很好-我不会感觉不好,你也不必担心。如果你想对不止一个问题表示感谢,一旦你有了更多的观点,你就可以回来投票,你想投票多少就投票多少!只是关于约会的提示。这必须更快,而不是通过转换为varchar10来删除时间部分。从表t中选择DATEADDdd、DATEDIFFdd、0、t.DateTimeColumn、0;它计算从第0年到日期的天数,并将该值添加到日期0。所有日期时间类型。
WHERE
(CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN ReportStartDate AND ReportEndDate) AND
(
    LIS_Results.Prelim_Report_Date is not null
    or
    ('@PrelimOnly' = 'NO') // if instead of NO VS sends empty string replace it here
)
SELECT
...
FROM
...
WHERE @PrelimOnly = 'NO' or LIS_Results.Prelim_Report_Date is not null
...
 WHERE (@PrelimOnly = 'NO') AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101)
BETWEEN @ReportStartDate AND @ReportEndDate) OR (LIS_Results.Prelim_Report_Date IS NOT NULL)
AND (CONVERT(VARCHAR(10), LIS_Results.Final_Report_Date, 101) BETWEEN @ReportStartDate AND
@ReportEndDate)