【问题标题】:Access IIF expression convert to SQLAccess IIF 表达式转换为 SQL
【发布时间】:2015-09-02 17:00:42
【问题描述】:

我使用以下 IIF 语句继承了一个 Access 查询,我试图将其转换为 SQL Where 条件。我玩了几天不能让它返回相同的结果。任何帮助将不胜感激。

访问

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)

【问题讨论】:

  • 这些字段的数据类型是什么?

标签: sql ms-access iif


【解决方案1】:

您应该成功使用几个 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 单引号样式!

【讨论】:

    【解决方案2】:

    这是等效的 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'
    

    【讨论】:

      【解决方案3】:

      你真的不应该需要所有的条件复杂性,这应该会产生相同的结果:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 2018-10-02
        • 1970-01-01
        相关资源
        最近更新 更多