2015-11-26 53 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' –