1

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

通过使用转换命令忽略时间戳,我可以使日期范围参数正常工作,从而为我提供当天或日期范围的所有记录。我现在想按初步报告日期过滤 SSRS reprot,以查找带有初步报告的记录,或者表中的所有记录。

  • 如果未创建初步报告,则数据库为 NULL
  • 如果创建了初步报告,则数据库具有时间戳。(显示创建日期和时间)

我需要找到所有不为 NULL 的记录或所有记录。(使用参数)

我有一个参数“仅显示初步报告?” @PrelimOnly 回答是或否。

如果我使用以下内容,它将正确显示所有记录(所有不为 NULL 的记录仅显示带有 Prelim 报告/时间戳的记录)

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

但是,如果用户选择 NO,我将如何让它显示包括 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)
4

4 回答 4

0

这里存在小技巧:

((LIS_Results.Prelim_Report_Date <> '@PrelimOnly') OR (1=@AllowNull))

如果用户选择 NO - 将 AllowNull 参数设置为 1,否则将其设置为 0

注意: AllowNull - 它是自定义附加参数,您应该添加与 @PrelimOnly 相同的方式

另一种可能的方法:

((LIS_Results.Prelim_Report_Date <> '@PrelimOnly') OR ('NO'='@PrelimOnly'))

对于您的完整查询,您应该这样做:

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
)
于 2013-10-24T21:26:47.400 回答
0

由于@PrelimOnly只能是YESNO,请使用:

SELECT
...
FROM
...
WHERE @PrelimOnly = 'NO' or LIS_Results.Prelim_Report_Date is not null
...

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

于 2013-10-24T21:57:37.663 回答
0

在 tsql 中使用 if 语句来判断参数是否为 yes 从条件为真的表中选择记录。

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

于 2013-10-24T21:23:53.657 回答
0

这是 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)

它要求重复日期和时间参数,以便两个参数仍然有效,并且 @PrelimOnly = 'NO' 必须是第一个。

于 2013-10-25T16:51:05.347 回答