SQL Server 2008中WHERE子句中的CASE语句
问题描述:
我想编写一个CASE
语句来查找基于@sFRomDate
的两个日期之间的数据是否为空。鉴于下面的查询不按我的要求工作。请帮我找到一个合适的解决方案SQL Server 2008中WHERE子句中的CASE语句
SELECT
*
FROM
tbl_emp_data
WHERE
CASE
WHEN @sFRomDate!=''
THEN SubmissionDate BETWEEN @sFRomDate AND DATEADD(DAY,1,@sToDate)
ELSE
SubmissionDate = NULL
END
答
这可能是你试图实施的逻辑。如果@sFRomDate
是NULL
或者是空的和SubmissionDate
也是NULL
或者空的记录将被返回。否则,将检查SubmissionDate
以确保它在您定义的范围内。
SELECT *
FROM tbl_emp_data
WHERE (COALESCE(@sFRomDate, '') = '' AND
COALESCE(SubmissionDate, '') = '') OR
(COALESCE(@sFRomDate, '') <> '' AND
COALESCE(SubmissionDate, '') <> '' AND
SubmissionDate BETWEEN @sFRomDate AND DATEADD(DAY, 1, @sToDate))
答
如果我理解你想要什么,我觉得它变得更简单遵循的逻辑,如果你写:
IF @sFromDate = ''
BEGIN
SELECT * FROM tbl_emp_data where SubmissionDate=null
END
ELSE
BEGIN
SELECT * FROM tbl_emp_data where SubmissionDate between @sFRomDate and DATEADD(DAY,1,@sToDate)
END
但作为@Tim Biegeleisen说,要小心空值,不只是为@ sFromDate而且@sToDate
你正在尝试做什么将不起作用。你想如何处理'@ sFRomDate'为空(或'NULL')的情况? –
'CASE'是T-SQL中的一个**表达式**(如'a + b'),它最终返回一个单一的原子值。你**不能**用它来控制你的代码流,或者有条件地运行代码片段。 –