如何在Access查询中从多列提取第一个非空经理层级ID?
Access 查询:从多列取第一个非空ID填充「经理」字段
需求说明
需要将主表的「经理」字段,从关联的经理层级表中,按经理ID→高级经理ID→总监ID→高级总监ID的优先级顺序,提取第一个非空的ID进行填充。
解决方案
方法1:嵌套 Nz 函数实现优先级取值
Nz 函数可将空值(Null)替换为指定内容,嵌套使用就能依次匹配优先级最高的非空ID:
SELECT 主表.员工ID, 主表.姓名, Nz(经理层级表.经理ID, Nz(经理层级表.高级经理ID, Nz(经理层级表.总监ID, 经理层级表.高级总监ID))) AS 经理 FROM 主表 INNER JOIN 经理层级表 ON 主表.员工ID = 经理层级表.员工ID;
- 逻辑:先检查「经理ID」,为空则继续检查「高级经理ID」,以此类推,最终返回第一个非空的层级ID。
方法2:Switch 函数按条件匹配
Switch 函数会按顺序判断条件,返回第一个满足条件的结果,适合多列优先级判断场景:
SELECT 主表.员工ID, 主表.姓名, Switch( Not IsNull(经理层级表.经理ID), 经理层级表.经理ID, Not IsNull(经理层级表.高级经理ID), 经理层级表.高级经理ID, Not IsNull(经理层级表.总监ID), 经理层级表.总监ID, True, 经理层级表.高级总监ID ) AS 经理 FROM 主表 INNER JOIN 经理层级表 ON 主表.员工ID = 经理层级表.员工ID;
- 逻辑:依次验证每一列是否非空,第一个符合的返回对应ID;最后用
True兜底返回「高级总监ID」,确保总有结果输出。
特殊情况处理:空字符串而非Null
如果经理层级表中的空值是空字符串而非Null,需要修改判断条件,以Switch为例:
Switch( 经理层级表.经理ID <> "", 经理层级表.经理ID, 经理层级表.高级经理ID <> "", 经理层级表.高级经理ID, 经理层级表.总监ID <> "", 经理层级表.总监ID, True, 经理层级表.高级总监ID )
更新主表「经理」字段
如果需要直接将查询结果写入主表的「经理」字段,使用更新查询:
UPDATE 主表 INNER JOIN 经理层级表 ON 主表.员工ID = 经理层级表.员工ID SET 主表.经理 = Nz(经理层级表.经理ID, Nz(经理层级表.高级经理ID, Nz(经理层级表.总监ID, 经理层级表.高级总监ID)));
内容的提问来源于stack exchange,提问作者Jon Snow
相关产品推荐
相关产品推荐

