2017-02-15 42 views
3

我有一個查詢聯接:SQL如何篩選基於邏輯JOIN

.... 
JOIN 
    Permission up ON up.PermissionID = c.PermissionID 
        AND (@IsUserAdmin = 1 AND up.EmployeeID = @EmployeeID) 
.... 

我只是想套用EmployeeID過濾器,如果@IsUserAdmin爲1

我怎麼能這樣做?

回答

0

可以使用case表達要做到這一點,像這樣:

join Permission up 
    on up.PermissionID =c.PermissionID 
    and up.EmployeeId = case 
    when @IsUserAdmin = 1 
     then @EmployeeID 
    else up.EmployeeId 
    end 

case表達式基本上說如果@IsUserAdmin = 1那麼up.EmployeeId必須等於@EmployeeId否則up.EmployeeId必須等於up.EmployeeId

如果up.EmployeeId是空的,你會在包裝的isnull(up.EmployeeId,0)coalesce(up.EmployeeId,0)兩個up.EmployeeId參考,以允許它評估爲相等。

-1

加入後使用where語句。

或代替書面許可了 (從許可選擇*高達 其中僱員= @ IsUserAdmin)試試這個

+0

'EmployeedID'!='@ IsUserAdmin'。後者是一個布爾/位...但是,將該子句移到'where語句應該工作。 – ps2goat

0

由於這是INNER JOIN,不涉及兩個連接表的過濾器最好移動到WHERE子句。引擎不關心,但它使查詢更易於程序員讀取。

... 
JOIN Permission up ON up.PermissionID = c.PermissionID 
... 
WHERE 
(up.EmployeeID = @EmployeeID OR @IsUserAdmin <> 1) 
... 
OPTION(RECOMPILE); 

如果@IsUserAdmin不爲1,則@EmployeeID值無關緊要。

如果@IsUserAdmin爲1,則將在過濾器中使用@EmployeeID的值。

Erland Sommarskog在Dynamic Search Conditions in T‑SQL中詳細討論了這種類型的查詢。他解釋了爲什麼你通常想爲這種類型的查詢添加OPTION(RECOMPILE)