【问题标题】:SQL CASE Selection Statement ErrorSQL CASE 选择语句错误
【发布时间】:2014-07-30 03:34:37
【问题描述】:

对 SQL 编程相当陌生。

我正在尝试创建一个存储过程,它将获取用户名,将其与用户表进行比较以检索他们的“角色”,然后从反馈表中选择与他们相关的所有反馈。

目前有 3 个可能的值: - 用户 - 治理委员会 - 管理员

如果角色是“治理委员会”或“管理员”,我希望检索表中的所有条目 但是,如果角色是“用户”,我只想要 [publish] 列设置为 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 来说是新手,我无法发现它。

提前致谢

汤姆

【问题讨论】:

  • CASE 在 T-SQL 中是一个 表达式,它可以返回各种值之一 - 它是 NOT 一个流控制语句,就像在其他语言,它不能用于运行一段代码或另一段代码。为此,您需要专门使用IF 和ELSE

标签: sql sql-server stored-procedures case


【解决方案1】:

您不能以这种方式使用 CASE 来控制流程。你必须使用 IF。

IF @Role='Admin'
  SELECT * FROM [CSLL].[Feedback]
ELSE IF @Role='Governance Board'
  SELECT * FROM [CSLL].[Feedback]
ELSE IF ... etc

【讨论】:

  • 双引号的问题
  • 是的,我继续解决了这个问题,但我想我也应该提到它,谢谢。
  • 是的,提到它以便 OP 知道存在差异可能有用
  • 非常感谢 - 现在正在工作。读过某处你不能真正在 SQL 中使用 IF 语句的猜测会忽略它。
  • IF 语句有相反的限制:您不能在 SELECT 中使用它们。
【解决方案2】:

您可以将此查询编写为单个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))

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

【讨论】:

    【解决方案3】:

    case 语句必须在 select 中。你可以用 if 代替。

    if(@Role = "Admin")
    then
        select * from CSLL.Feedback;
    else if(...)
    

    或者你可以把case放在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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多