2016-08-19 128 views
0

我想编写一个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 
+0

你正在尝试做什么将不起作用。你想如何处理'@ sFRomDate'为空(或'NULL')的情况? –

+0

'CASE'是T-SQL中的一个**表达式**(如'a + b'),它最终返回一个单一的原子值。你**不能**用它来控制你的代码流,或者有条件地运行代码片段。 –

回答

2

这可能是你试图实施的逻辑。如果@sFRomDateNULL或者是空的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)) 
+0

不,如果sFRomDate为空或空,那么我想获取SubmissionDate为空或空的数据,否则我必须在日期之间检查 – Reshma

+0

我按照我的理解逐字实现了你的逻辑。真的,我认为你有一个设计问题。您应该包括显示所有边缘案例的样本输入和输出。 –

+1

谢谢,现在我正在得到正确的输出 – Reshma

1

如果我理解你想要什么,我觉得它变得更简单遵循的逻辑,如果你写:

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