我正在尝试构建一个查询,在其中可以获得多个列中可用的第一个非空 id
所以我的主表是这样的,
员工编号 | 名字 | 经理 |
---|---|---|
1 | 约翰 | |
2 | 母鹿 | |
3 | 简 | |
4 | 菲尔 | |
5 | 珍 |
我想从下表查找经理
员工编号 | 经理ID | 高级经理ID | 导演ID | 高级总监ID |
---|---|---|---|---|
1 | 21 | 22 | 23 | 24 |
2 | 22 | 23 | 24 | |
3 | 23 | 24 | ||
4 | 24 | |||
5 | 22 | 23 | 24 |
我的输出应该是这样的
员工编号 | 名字 | 经理 |
---|---|---|
1 | 约翰 | 21 |
2 | 母鹿 | 22 |
3 | 简 | 23 |
4 | 菲尔 | 24 |
5 | 珍 | 22 |
所以基本上,我尝试使用这个 IIF 函数来执行嵌套 if 和 switch 函数。 两者都没有返回我期望的输出。 谢谢!
编辑1:我尝试使用Nz,但它适用于ManagerID和SeniorManagerID,但由于某种原因不适用于DirectorID和SeniorDirectorID。 意思是,我可以获得 ManagerID 和 SeniorManagerID,但对于其他 2 个,它返回空白。
编辑2:我尝试将查询更改为而不是检查NULL,我尝试将其更改为空字符串,但仍然不起作用。
Access中使用Nz()函数
SELECT Nz(ManagerID, Nz(SeniorManagerID, Nz(DirectorID, Nz(SeniorDirectorID, "None")))) AS Person FROM tablename;
否则,使用 IIf() 或 Switch 和 IS NULL 的表达式将会更长。更多信息http://allenbrowne.com/QueryPerfIssue.html#Nz
按照以下代码执行 您可以从这里下载链接 https://www.mediafire.com/file/3s6l9vjtdi4uzau/TestDB.accdb/file
Private Sub Command3_Click()
DoCmd.SetWarnings False
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT [employee id], [manager id], [senior manager id], [director id], [senior director id] " & _
"FROM tblmanagers")
If Not (rs.EOF And rs.BOF) Then
rs.MoveFirst
Do Until rs.EOF = True
Dim MyManager As Integer
If Nz(rs![senior director id] & "") <> vbNullString Then
MyManager = rs![senior director id]
End If
If Nz(rs![director id] & "") <> vbNullString Then
MyManager = rs![director id]
End If
If Nz(rs![senior manager id] & "") <> vbNullString Then
MyManager = rs![senior manager id]
End If
If Nz(rs![manager id] & "") <> vbNullString Then
MyManager = rs![manager id]
End If
CurrentDb.Execute "UPDATE tblemployees SET " & _
"[employee manager] = " & MyManager & " " & _
"WHERE [employee id] = " & rs![employee id] & ""
rs.MoveNext
Loop
Else
End If
rs.Close
Set rs = Nothing
End Sub