我已经找到了几篇关于如何完成我想用几种方法(IS NULL,CASE,COALESCE)做的事情的文章,但我认为在这一点上我读完所有这些后可能比以往更困惑了使解决方案比它需要的更难。我是T-SQL的新手,我目前正在使用VS 2005来构建基本的医疗报告。
我通过使用convert命令忽略时间戳,使日期范围参数正常工作,从而为我提供日期或日期范围的所有记录。我现在想要根据初步报告日期过滤SSRS重新编制,以查找包含初步报告的记录,或者表中的所有记录。
我需要查找所有记录而不是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)
答案 0 :(得分:0)
在tsql中使用if语句来说明参数是否从条件为真的表中选择记录。
如果没有从条件为true且日期字段不为空的表中选择记录。
答案 1 :(得分: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
)
答案 2 :(得分:0)
由于@PrelimOnly
只能是或否,请使用:
SELECT
...
FROM
...
WHERE @PrelimOnly = 'NO' or LIS_Results.Prelim_Report_Date is not null
...
如果参数为 NO ,则满足OR
的左手条件并返回所有行,否则将根据需要仅返回那些非空行。< / p>
答案 3 :(得分: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'必须是第一个。