我有一個查詢聯接:SQL如何篩選基於邏輯JOIN
....
JOIN
Permission up ON up.PermissionID = c.PermissionID
AND (@IsUserAdmin = 1 AND up.EmployeeID = @EmployeeID)
....
我只是想套用EmployeeID
過濾器,如果@IsUserAdmin
爲1
我怎麼能這樣做?
我有一個查詢聯接:SQL如何篩選基於邏輯JOIN
....
JOIN
Permission up ON up.PermissionID = c.PermissionID
AND (@IsUserAdmin = 1 AND up.EmployeeID = @EmployeeID)
....
我只是想套用EmployeeID
過濾器,如果@IsUserAdmin
爲1
我怎麼能這樣做?
可以使用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
參考,以允許它評估爲相等。
加入後使用where語句。
或代替書面許可了 (從許可選擇*高達 其中僱員= @ IsUserAdmin)試試這個
由於這是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)
。
'EmployeedID'!='@ IsUserAdmin'。後者是一個布爾/位...但是,將該子句移到'where語句應該工作。 – ps2goat