【发布时间】:2017-08-09 11:27:12
【问题描述】:
我正在尝试合并一对几乎相同的查询,这些查询使用略有不同的WHERE 子句,具体取决于参数化变量(管道和完成)。
我正在努力找出最好的编码方式,以根据@ReportMode 变量查找日期范围或NULL。
第一个实例中的WHERE 子句本质上是:
DECLARE @ReportMode VARCHAR(20),
@ApplictnDate DATETIME;
SET @ApplictnDate =
CASE
WHEN @ReportMode = 'Completions' THEN '20160801 00:00:00'
WHEN @ReportMode = 'Pipeline' THEN '20170201 00:00:00'
END
SELECT
Id, AppDate, CompDate
FROM
TbTable
WHERE
AppDate > @ApplictnDate AND
CompDate BETWEEN '20170701 00:00:00' AND '20170731 00:00:00'
第二个查询是:
DECLARE @ReportMode VARCHAR(20),
@ApplictnDate DATETIME;
SET @ApplictnDate =
CASE
WHEN @ReportMode = 'Completions' THEN '20160801 00:00:00'
WHEN @ReportMode = 'Pipeline' THEN '20170201 00:00:00'
END
SELECT
Id, AppDate, CompDate
FROM
TbTable
WHERE
AppDate > @ApplictnDate AND
CompDate IS NULL
问题:
我可以使用变量在
SELECT语句中创建CASE语句,还是需要根据@ApplictnDate设置为SET?如何在语法上创建
CASE语句来处理 NULL 或日期范围?
谢谢
【问题讨论】:
-
只需使用 OR 和 () 将 where 语句保持为一个单元?
-
只是吹毛求疵:
CASE是 T-SQL 中的 表达式(如a+b) - 不是语句。它是被评估为单个原子值的东西。
标签: sql sql-server case where