Access中CASE语句转IIF语句的正确性验证咨询
你的CASE转IIF是否正确?咱们来拆解分析
首先先把原CASE的逻辑理清楚:
Case When sfrstcr_pidm is not null Then 'A' When sfrstcr_pidm <> '' Then 'A' Else Null End as StudentStatus
CASE语句是按顺序判断的:
- 第一个条件先检查
sfrstcr_pidm是不是不为null,是的话直接返回'A' - 只有当
sfrstcr_pidm是null的时候,才会走到第二个条件——但这里有个关键点:null和任何值做比较的结果都是未知,不会触发条件成立,所以第二个sfrstcr_pidm <> ''的判断永远不会生效,最终原CASE的实际逻辑就是:只要字段不为null就返回'A',否则返回null。
再看你写的IIF转换:
IIF ([sfrstcr_pidm] is not null, ‘A’, IIF([sfrstcr_pidm] <> ‘’, ‘A’, Null))
结论:逻辑结果上是等价的,但有两个坑要注意
- 语法错误:你用了中文的单引号
‘’,Access的Jet SQL只认英文单引号'',这个必须替换,不然直接报语法错误跑不起来。 - 逻辑冗余:嵌套的第二个IIF完全多余,因为能走到这个分支的时候,
sfrstcr_pidm已经是null了,此时sfrstcr_pidm <> ''永远不可能成立,这个分支根本不会返回'A'。
给你优化后的正确写法
如果原CASE确实是想表达“非null就返回'A'”,那简化成下面这样就够了:
IIF([sfrstcr_pidm] IS NOT NULL, 'A', NULL) AS StudentStatus
要是原CASE的实际意图是字段不为null且不是空字符串才返回'A'(可能原CASE的条件顺序写反了),那正确的IIF应该这么写:
IIF([sfrstcr_pidm] IS NOT NULL AND [sfrstcr_pidm] <> '', 'A', NULL) AS StudentStatus
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

