2015-11-26 60 views
2

嗨我想重複我在MS Access中使用的複雜的IIF功能,但似乎無法將它翻譯成使用CASE的SLQ 2008。我想創建一個WHERE子句這樣的事情複雜的IIF到SQL 2008

..... WHERE (IIF([Created Date]= NULL, IIF(DATEDIFF(day,[Created Date],[POSTED Date])<=3,1,IIF([Created Date] BETWEEN [Disti Reported Sales Date] AND [Posted Date]),1,NULL)))=1 AND ...... 基本上什麼它做的是尋找從一列的日期,並將其與另外兩列,但如果其中的一列是NULL,則它採用了不同的比較。

+2

您確定嗎?似乎鬆散地檢查,如果[創建日期] IS NULL,然後在[創建日期]和[發佈日期]上執行日期差異,該日期差異不能返回值<= 3 –

+0

你是對的,是一個漫長的夜晚,錯過鍵入它,但概念是相同的如果我想檢查的日期是'空',然後做這個測試'ELSE'做這個測試是我正在尋找。 –

回答

1

直譯應該接近這個:

WHERE (CASE 
    WHEN [Created Date] IS NULL 
    THEN (CASE 
     WHEN DATEDIFF(DD, [Created Date], [POSTED Date]) <= 3 
     THEN 1 
     ELSE (CASE 
      WHEN [Created Date] BETWEEN [Disti Reported Sales Date] AND [Posted Date] 
      THEN 1 
      ELSE 0 
      END) 
     END) 
    ELSE 0 
    END) = 1 

然而,這可以簡化爲這樣的事:

WHERE (CASE 
    WHEN [Created Date] IS NULL AND DATEDIFF(DD, [Created Date], [POSTED Date]) <= 3 THEN 1 
    WHEN [Created Date] IS NULL AND [Created Date] BETWEEN [Disti Reported Sales Date] AND [Posted Date] THEN 1 
    ELSE 0 END) = 1 

正如我的評論指出,它仍然看起來很奇怪,如果[創建日期] IS NULL,你正試圖在任何計算中仍然使用它。

+0

謝謝,這是我需要爲深夜的困惑而感到難過。以下是我需要做的調整,因爲假定在兩種情況下被測試的字段都是「NULL」。 (當日,DB。[Created At],POS。[POS Trans Date]))<= 3 THEN 1 當銷售點[Disti報告的銷售訂單日期]爲NULL和ABS(DATEDIFF [Disti Reported Sales Order Date] IS NOT NULL AND DB。[Created At] BETWEEN POS。[Disti Reported Sales Order Date] AND POS。[POS Trans Date] THEN 1 ELSE 0 END)= 1' –