我主要使用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
答案 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
的数量与您需要的数量一样大时。
仍然,Switch
或IIf
方法相当于将数据写入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)