将案例转换为IIF

时间:2013-04-30 19:33:30

标签: sql sql-server ms-access

我主要使用SQL Server,很少使用Access。我在SQL服务器中有case语句,我需要在Access中变成嵌套的IIF语句,我很难让它工作。 SQL代码是:

(CASE 
    WHEN (RRDD = '2029' 
        THEN 'IS' 
    WHEN RRDD = '2214' OR '2219' OR '2220' OR '2221' OR '2230' OR '2265'
        THEN 'AIR' 
    WHEN RRDD = '2044' OR '2323' OR '2327' OR '2331' OR '2339' 
        THEN 'LogDist' 
    WHEN RRDD = '2037' 
        THEN 'MailInn' 
    WHEN RRDD = '2213' OR '2307' OR '2311' OR '2332' OR '2334' OR '2338' 
             OR '2705' OR '2706'
        THEN 'GFF' 
    WHEN RRDD = '2010' 
        THEN 'Corp' 
    WHEN RRDD = '2040' OR '2041' OR '2081' OR '2086' 
        THEN 'Cap' 
      ELSE NULL 
END) AS RegDIs

3 个答案:

答案 0 :(得分:3)

这个案例陈述很疯狂 - 考虑进入外部表。它实际上不会按原样运行 - 例如,您有一个额外的括号并且使用OR不正确。

话虽如此,基本上你需要用IIF替换WHEN(然后用逗号替换,并将你的下一个IIF作为最后的参数包括在内 - 这应该是关闭的:

(IIF(RRDD = '2029', 'IS',
    IIF(RRDD IN ('2214', '2219', '2220', '2221', '2230', '2265'), 'AIR',
    IIF(RRDD IN ('2044', '2323', '2327', '2331', '2339'), 'LogDist',
    IIF(RRDD = '2037', 'MailInn',
    IIF(RRDD IN ('2213', '2307', '2311', '2332', '2334', '2338', '2705', '2706'), 'GFF',
    IIF(RRDD = '2010', 'Corp',
    IIF(RRDD IN ('2040', '2041', '2081', '2086'), 'Cap',
    NULL)))))))) AS RegDIs

答案 1 :(得分:3)

Switch视为多个IIf表达式的替代。

Switch
    (
        RRDD = '2029', 'IS',
        RRDD IN ('2214','2219','2220','2221','2230','2265'), 'AIR',
        RRDD IN ('2044','2323','2327','2331','2339'), 'LogDist',
        RRDD = '2037', 'MailInn',
        RRDD IN ('2213','2307','2311','2332','2334','2338','2705','2706'), 'GFF',
        RRDD = '2010', 'Corp',
        RRDD IN ('2040','2041','2081','2086'), 'Cap'
    ) AS RegDIs

使用Switch,当条件都不匹配时,函数返回Null。

我发现Switch更容易理解,尤其是当IIfs的数量与您需要的数量一样大时。

仍然,SwitchIIf方法相当于将数据写入SQL语句。正如其他人提到的,我认为查找表是一种更好的方法。

RRDD RegDIs
2029 IS
2214 AIR
2219 AIR
2220 AIR

在需要时编辑表格应该更容易,而不是修改复杂的查询。

答案 2 :(得分:0)

您的原始代码不正确。你不能说RRDD = '2044' OR '2323'。你可以说:RRDD = '2044' OR RRDD = '2323'。或者,您可以使用in

访问函数iif只有“then”和“else”子句。所以,你必须嵌套调用。

这使代码更麻烦。并且,跟踪结束括号可能是一场噩梦。正如我在评论中建议的那样,一个小的参考表将是一个更优雅的解决方案。

以下是使用iif的代码:

  select iif(RRDD = '2029', 'IS',
             iif(RRDD in ('2214', '2219', '2220', '2221', '2230', '2265'), 'AIR',
                 iif(RRDD in ('2044', '2323', '2327', '2331', '2339'), 'LogDist',
                     iif(RRDD = '2037', 'MailInn',
                         iif(RRDD in ('2213', '2307', '2311', '2332', '2334', '2338', '2705', '2706'), 'GFF',
                             iif(RRDD = '2010', 'Corp',
                                 iif(RRDD in ('2040', '2041', '2081',  '2086'), 'Cap', NULL
                                    )
                                )
                            )
                        )
                     )
                 )
             ) AS RegDI)