SQL编程相当新。
我正在尝试创建一个存储过程,该过程将获取用户名,将其与users表进行比较以检索其“角色”,然后从Feedback表中选择与其相关的所有反馈。
目前有3种可能的值: - 用户 - 治理委员会 - 管理员
如果角色是“治理委员会”或“管理员”,我希望检索表中的所有条目 但是,如果角色是“用户”,我只想要将[publish]列设置为true或“Author”或“IdentifiedBy”列设置为自己的条目。
这是我目前所拥有的,但是它会在案例陈述中抛出错误
@Alias varchar(max),
AS
DECLARE @Role varchar(max)
SET @Role =
(
SELECT [Role] FROM [CSLL].[Users] WHERE [Alias] = @Alias
)
CASE
WHEN @Role = "Admin" THEN SELECT * FROM [CSLL].[Feedback]
WHEN @Role = "Governance Board" THEN SELECT * FROM [CSLL].[Feedback]
WHEN @Role = "User" THEN SELECT * FROM [CSLL].[Feedback] WHERE [Publish] = True OR [Author] = @Alias or [IdentifiedBy]=@Alias
ELSE
END
任何帮助都将非常感激。我确定这只是我正在做的事情,这是愚蠢的但是对SQL不熟悉我无法发现它。
提前致谢
汤姆
答案 0 :(得分:1)
您不能以这种方式使用CASE来控制流量。你必须使用IF。
IF @Role='Admin'
SELECT * FROM [CSLL].[Feedback]
ELSE IF @Role='Governance Board'
SELECT * FROM [CSLL].[Feedback]
ELSE IF ... etc
答案 1 :(得分:0)
案例陈述必须在选择内。你可以改用if。
if(@Role = "Admin")
then
select * from CSLL.Feedback;
else if(...)
或者您可以将案例放在where子句中:
select *
from CSLL.Feedback
where
CASE
WHEN @Role = "Admin" THEN [IdentifiedBy]
WHEN @Role = "Governance Board" THEN [IdentifiedBy]
WHEN @Role = "User" THEN @Alias
END
IN (IdentifiedBy, Author)
OR [Publish] = True
答案 2 :(得分:0)
您可以将此查询编写为单个select
。
select f.*
from Feedback f cross join
(SELECT [Role] FROM [CSLL].[Users] WHERE [Alias] = @Alias) r
where (r.[role] in ('Admin', 'Governance Board') ) or
(r.[role] = 'User' and ([Publish] = True OR [Author] = @Alias or [IdentifiedBy] = @Alias))
我认为从低调逻辑和维护代码的角度来看,将逻辑保留在一个地方并进行单一查询会更好。