MS Access中使用IIF与Not IN运算符识别无指定值行的语法错误及结果异常问题
解决MS Access中IIF+Not IN的语法错误与逻辑问题
我来帮你搞定这个Access查询的问题,你的需求是找出所有KH列(最多16个)都不包含A1/A2的行,并添加Identified列标记Yes/No,原查询的问题主要出在语法结构和函数使用上,下面一步步拆解:
原查询的核心错误
- 语法结构错误:你把
IIF函数直接放在了FROM表名之后,这不符合Access SQL的语法规则——IIF是用来生成计算字段的,应该放在SELECT的字段列表里,而不是表名后面。 - 缺少字段别名:没有给
IIF的结果指定别名(比如Identified),这样查询结果里不会出现你想要的命名列。 - IIF参数不完整:你的
IIF只写了条件部分,缺少条件满足和不满足时的返回值(虽然Access允许省略,但明确写出更符合你的需求)。
修正后的查询语句
把IIF移到字段列表中,补充完整参数,并指定别名,针对你给出的KH1-KH6列,正确的查询如下:
SELECT ID, KH1, KH2, KH3, KH4, KH5, KH6, IIF( (Nz([KH1], ' ') NOT IN ('A1', 'A2')) AND (Nz([KH2], ' ') NOT IN ('A1', 'A2')) AND (Nz([KH3], ' ') NOT IN ('A1', 'A2')) AND (Nz([KH4], ' ') NOT IN ('A1', 'A2')) AND (Nz([KH5], ' ') NOT IN ('A1', 'A2')) AND (Nz([KH6], ' ') NOT IN ('A1', 'A2')), 'Yes', 'No' ) AS Identified FROM YourTableName; -- 替换成你的实际表名
关键细节说明
- Nz函数的作用:用
Nz([KHx], ' ')把空值替换成空格,避免空列在NOT IN运算中返回未知结果,确保空列不会干扰“所有列都不含A1/A2”的判断。 - 逻辑判断:只有当所有KH列(处理空值后)都不在('A1','A2')里时,
IIF才返回'Yes',否则返回'No',完全匹配你的预期输出。 - 扩展到16列:如果有KH7到KH16,只需要在
IIF的条件里继续添加AND (Nz([KHx], ' ') NOT IN ('A1', 'A2'))即可,保持所有条件用AND连接。
验证预期结果
用修正后的语句查询你给出的示例数据,会得到和你预期完全一致的结果:
- ID003、005、008的所有KH列都不含A1/A2,标记为'Yes'
- ID001、002、006、007包含A1或A2,标记为'No'
内容的提问来源于stack exchange,提问作者KApril
相关产品推荐
相关产品推荐

