2017-07-20 118 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