SQL CASE选择语句错误

时间:2014-07-29 16:49:08

标签: sql sql-server stored-procedures case

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不熟悉我无法发现它。

提前致谢

汤姆

3 个答案:

答案 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))

我认为从低调逻辑和维护代码的角度来看,将逻辑保留在一个地方并进行单一查询会更好。