SQL Advanced IIF使用MS Access

时间:2017-07-20 01:01:25

标签: sql ms-access iif

是否可以在IIF语句的逻辑测试中使用SQL查询?我有一张员工表,其中包含了人们所期望的所有一般员工信息。其中一个字段IsManager是一个布尔值,我使用IIF语句根据某人是否设置为true来更改查询的输出。

我遇到的问题是当我将它应用于一对多表时,它正在检查当前记录是否将IsManager字段设置为true。我想检查当前查询的人是否将该字段设置为true。

SELECT TB2.ID, IIF(TB1.IsManager, TB1.LastName, 'Restricted'), IIF(TB1.IsManager, TB1.FirstName, 'Restricted') 
FROM TB1 INNER JOIN TB2 ON TB1.EmployeeNumber = TB2.EmployeeNumber

如果我正在检查的记录有IsManager=True,则此方法有效。我想检查当前用户的IIF语句,我在其他查询中使用以下

SELECT IsManager 
FROM TB1 
WHERE Username=currentUser

currentUser是VBA变量Environ("USERNAME"),其中也记录在员工详细信息表中。

我可以将这些结合起来并使用上述查询执行IFF,例如:

SELECT IIF(SELECT IsManager 
FROM TB1 
WHERE Username=currentuser, TB1.LastName, 'Restricted') FROM .... etc etc

如果没有,我可以使用MC Access SQL可用的替代方法

2 个答案:

答案 0 :(得分:0)

你只需要两个这样的连接

SELECT 
  TB2.ID, 
  IIF(AM_I_MANAGER.IsManager, TB1.LastName, 'Restricted'), 
  IIF(AM_I_MANAGER.IsManager, TB1.FirstName, 'Restricted') 
FROM TB1
CROSS JOIN TB1 AS AM_I_MANAGER ON AM_I_MANAGER.Username=currentUser 
JOIN TB2 ON TB1.EmployeeNumber = TB2.EmployeeNumber

我们在这里使用交叉联接,因为AM_I_MANAGER.Username=currentUser将返回1行。然后,我们对TB1表的每一行使用这一行(因此交叉连接仅为"交叉" 1行)。如果该过滤器返回多行,则无法获得良好的结果。

答案 1 :(得分:0)

您可以在查询中使用 DLookup

PARAMETERS Username Text (255);
SELECT 
    TB2.ID, 
    IIF(DLookup("IsManager", "TB1", "Username = '" & Username & "')"), TB1.LastName, 'Restricted'),
    IIF(DLookup("IsManager", "TB1", "Username = '" & Username & "')"), TB1.FirstName, 'Restricted') 
FROM 
    TB1 
INNER JOIN 
    TB2 
    ON TB1.EmployeeNumber = TB2.EmployeeNumber