Reputation: 44
I have a SQL Server select statement which is supposed to work on case basis
Case 1: When user role id supplied is admin all data will be select
Case 2: Apart form admin role the select will return all data except admin data.
DECLARE @UserRoleID INT = 3
SELECT urp.id AS 'iD'
,canview AS 'read'
,cancreate AS 'create'
,canedit AS 'update'
,candelete AS 'delete'
,ur.description AS 'userRole'
,ch.description AS 'rightsToMenu'
,urp.creator AS 'creator'
,urp.datecreated AS 'dateCreated'
,urp.datemodified AS 'dateModified'
,urp.modifier AS 'modifier'
FROM userrolepermission urp
INNER JOIN userrole ur ON urp.userroleid = ur.id
INNER JOIN channel AS ch ON urp.channelid = ch.id
WHERE urp.UserRoleID IN (
(
CASE
WHEN @UserRoleID = 1
THEN ('2')
ELSE CAST(@UserRoleID AS NVARCHAR)
END
-- tried this also
WHERE (
CASE
WHEN urp.userroleid = @UserRoleID
AND @UserRoleID > 1
THEN @UserRoleID
ELSE @UserRoleID
END IN (
SELECT ID
FROM UserRole(NOLOCK)
)
)
)
)
Here where condition returns all data which is not desired.
Example:
@UserRoleID = 1
- Then Retrieve all data and If @UserRoleID != 1
Then Retrieve specific matching records.
Upvotes: 0
Views: 111
Reputation: 336
You can simply use Dynamic SQL.
DECLARE @query NVARCHAR(MAX)
SET @query='SELECT urp.id AS [iD]
,canview AS [read]
,cancreate AS [create]
,canedit AS [update]
,candelete AS [delete]
,ur.description AS [userRole]
,ch.description AS [rightsToMenu]
,urp.creator AS [creator]
,urp.datecreated AS [dateCreated]
,urp.datemodified AS [dateModified]
,urp.modifier AS [modifier]
FROM userrolepermission urp
INNER JOIN userrole ur ON urp.userroleid = ur.id
INNER JOIN channel AS ch ON urp.channelid = ch.id '
IF @UserRoleID=1
BEGIN
SET @query += ' your condition'
END
ELSE
BEGIN
SET @query += ' your condition'
end
EXECUTE @query
Upvotes: 2
Reputation: 208
used this Code...
WHERE urp.UserRoleID IN((CASE WHEN @UserRoleID = 1 THEN ('2') ELSE CAST(@UserRoleID AS NVARCHAR) END))
UserRoleID=3 record get it this code usefully
Upvotes: 0
Reputation: 12959
You can go for IF ELSE logic. Eventhough it looks longer, it looks cleaner.
DECLARE @UserRoleID INT =3
IF @UserRoleID = 1 -- admin
BEGIN
SELECT
urp.id AS 'iD',
canview AS 'read',
cancreate AS 'create',
canedit AS 'update',
candelete AS 'delete',
ur.description AS 'userRole',
ch.description AS 'rightsToMenu',
urp.creator AS 'creator',
urp.datecreated AS 'dateCreated',
urp.datemodified AS 'dateModified',
urp.modifier AS 'modifier'
FROM userrolepermission AS urp
INNER JOIN userrole AS ur
ON urp.userroleid = ur.id
INNER JOIN channel AS ch
ON urp.channelid = ch.id
END
ELSE
BEGIN
SELECT
urp.id AS 'iD',
canview AS 'read',
cancreate AS 'create',
canedit AS 'update',
candelete AS 'delete',
ur.description AS 'userRole',
ch.description AS 'rightsToMenu',
urp.creator AS 'creator',
urp.datecreated AS 'dateCreated',
urp.datemodified AS 'dateModified',
urp.modifier AS 'modifier'
FROM userrolepermission AS urp
INNER JOIN userrole AS ur
ON urp.userroleid = ur.id
INNER JOIN channel AS ch
ON urp.channelid = ch.id
WHERE urp.UserRoleID = @UserRoleID
END
Upvotes: 0
Reputation: 50163
You can use Boolean logic instead :
where (@UserRoleID = 1) OR
(@UserRoleID <> 1 AND UserRole = @UserRoleID);
Upvotes: 1
Reputation: 5643
You can try like below
WHERE (
isnull(@UserRoleID, 0) = 1
OR (
isnull(@UserRoleID, 0) <> 1
AND dbo.TableName.UserRole = @UserRoleID
)
)
Upvotes: 0