对于SQL编程来说相当新。
我正在尝试创建一个存储过程,它将使用用户名,将其与用户表进行比较,以检索他们的“角色”,然后从反馈表中选择与他们相关的所有反馈。
目前有三个可能的值:-用户-治理委员会-管理
如果该角色是“治理委员会”或“管理”,则希望检索表中的所有条目,但是如果该角色是“用户”,则只希望将发布列设置为true的条目,或者将“作者”或“IdentifiedBy”列设置为自己。
这是我目前所拥有的,但是它在case语句周围抛出错误。
@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不熟悉,我找不到它。
提前感谢
汤姆
发布于 2014-07-29 19:34:37
您可以将此查询编写为单个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))我认为将逻辑保持在一个地方,并进行一个查询,从不理解逻辑和维护代码的角度来看更好。
发布于 2014-07-29 16:53:53
您不能用这种方式来控制流。你得用如果。
IF @Role='Admin'
SELECT * FROM [CSLL].[Feedback]
ELSE IF @Role='Governance Board'
SELECT * FROM [CSLL].[Feedback]
ELSE IF ... etc发布于 2014-07-29 16:56:37
Case语句必须位于select的内部。你可以用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] = Truehttps://stackoverflow.com/questions/25020746
复制相似问题