1

我主要使用 SQL Server,很少使用 Access。我在 SQL Server 中有 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
4

3 回答 3

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与您需要的一样大时。

尽管如此,SwitchorIIf方法都相当于将数据写入 SQL 语句。正如其他人提到的,我认为查找表会是更好的方法。

RRDD RegDIs
2029 IS
2214 AIR
2219 AIR
2220 AIR

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

于 2013-04-30T20:39:57.897 回答
3

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

话虽如此,基本上你需要用 IIF( 替换 WHEN 并用逗号替换 THEN 并将你的下一个 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
于 2013-04-30T19:42:46.153 回答
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)
于 2013-04-30T19:48:41.077 回答