繁体   English   中英

访问IIF表达式转换为SQL

[英]Access IIF expression convert to SQL

我继承了下面的IIF语句,试图将其转换为SQL Where条件的Access查询。 我已经玩了几天,但无法获得相同的结果。 任何帮助,将不胜感激。

访问

WHERE (((IIf([EFFDATE]-[MATDATE]<>[PDU_DAYS]-1 And [Calc_Type]="Cycles",IIf([PDU_DAYS] Between [30DayDQMin]+1 And [89DayDQMax]+1,"Yes","No"),IIf([PDU_DAYS] Between 31 And 90,"Yes","No")))="Yes"));

对于SQL代码,我一直在尝试各种布尔语句,例如以下语句。 我也尝试过建立一些案例逻辑。 到目前为止没有运气。

([EffDATE]-[MatDate] <> [PDU_Days]-1 and CalcType = 'Cycles' and PDU_Days Between [30DayDQMin]+1 and [89DayDQMax]+1 or PDU_Days Between 31 and 90)

您应该成功使用以下几种CASE WHEN x THEN a ELSE b END指令:

WHERE
CASE WHEN (([EFFDATE]-[MATDATE]<>[PDU_DAYS]-1) And ([Calc_Type]='Cycles')) THEN
    CASE WHEN (([PDU_DAYS] Between [30DayDQMin]+1) And ([89DayDQMax]+1))
        THEN 'Yes' ELSE 'No' END
ELSE 
     CASE WHEN ([PDU_DAYS] Between 31 And 90) THEN 'Yes' ELSE 'No' END
END 

= 'Yes'

注意T-SQL单引号样式!

这是等效的SQL-Server语法:

(
    CASE WHEN ([EFFDATE]-[MATDATE] <> [PDU_DAYS]-1 AND [Calc_Type]= 'Cycles') THEN
        CASE WHEN ([PDU_DAYS] BETWEEN [30DayDQMin]+1 AND [89DayDQMax]+1) THEN 'Yes' ELSE 'No' END
    ELSE
        CASE WHEN [PDU_DAYS] BETWEEN 31 AND 90 THEN 'Yes' ELSE 'No' END
    END
) = 'yes'

如果[MATDATE][EFFDATE]datetime字段,则:

(
    CASE WHEN (DATEDIFF(dd,[MATDATE],[EFFDATE]) <> [PDU_DAYS]-1 AND [Calc_Type]= 'Cycles') THEN
        CASE WHEN ([PDU_DAYS] BETWEEN [30DayDQMin]+1 AND [89DayDQMax]+1) THEN 'Yes' ELSE 'No' END
    ELSE
        CASE WHEN [PDU_DAYS] BETWEEN 31 AND 90 THEN 'Yes' ELSE 'No' END
    END
) = 'Yes'

您确实不需要所有条件卷积,这应该产生相同的结果:

WHERE ([EFFDATE]-[MATDATE]<>[PDU_DAYS]-1 
       AND [Calc_Type]="Cycles" 
       AND ([PDU_DAYS] BETWEEN [30DayDQMin]+1 AND [89DayDQMax]+1)
      )
      OR ([PDU_DAYS] Between 31 And 90)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM