2016-08-19 126 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