2017-07-20 47 views
0

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

我遇到的问题是,当我将它应用于一对多表时,它正在检查当前记录是否将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访问SQL

+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行)。如果该过滤器返回多行,您将无法获得良好的结果。

+0

在FROM子句上运行此语法错误时出现以下错误。检查了三次语法,看不到它。 – iShaymus

+0

显然MS Access不使用CROSS JOIN – iShaymus

+0

@iShaymus - 只要取出“CROSS”应该没问题。 – Hogan

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