存储过程中嵌套的条件(If-Else)

时间:2016-05-18 16:03:56

标签: sql-server tsql stored-procedures

第一次在这里问一个问题。提前感谢您的帮助。

我主要是一个前端人员,有时会被SQL语法/控制流程绊倒。

我已经编写了一个存储过程,用于指定要传递的参数(@listAll),该参数指定是否列出表中队列中的所有注册以供查看。

我希望通过IF-ELSE条件运行RQ.Processed,显示为INT(0或1),将0或1设置为字符串(不是已处理/已处理)。这将在我们的前端填充数据表,以便我们的客户查看注册队列。

但是,在我尝试添加此条件的任何地方,我都会遇到语法错误。我还假设将用于数据类型转换的变量(@statusConversion)需要超出select语句的范围,但我可能完全关闭。

这是我到目前为止所做的:

create proc [dbo].[Portal.RegistrationQueue_ListAll] 
    (@listAll int)
as
    set nocount on

    declare @statusConversion varchar(30)

    if (@listAll = 1)
    begin
        select 
            C.CompanyName as 'Company', 
            RCG.Learner_Tag as 'Registration Group', 
            convert(varchar(40), RQ.CreatedOn, 110) as 'Date', 
            RQ.Processed as 'Status'
        from 
            [dbo].[Portal.RegistrationQueue] RQ
        join 
            [dbo].[Portal.Company] C on RQ.CompanyID = C.Id
        join 
            [dbo].[Portal.RegisteredCourseGroup] RCG on RQ.RegistrationGroupID = RCG.Id
    end
    else
    begin
        select 
            C.CompanyName as 'Company', 
            RCG.Learner_Tag as 'Registration Group', 
            convert(varchar(40), RQ.CreatedOn, 110) as 'Date', 
            RQ.Processed as 'Status'
        from 
            [dbo].[Portal.RegistrationQueue] RQ
        join 
            [dbo].[Portal.Company] C on RQ.CompanyID = C.Id
        join 
            [dbo].[Portal.RegisteredCourseGroup] RCG on RQ.RegistrationGroupID = RCG.Id
        where 
            RQ.Processed = 0
    end
GO

我需要的是帮助放置IF-ELSE以将(0,1)转换为未经处理的',#39;已处理的'如果我把转换变量放在正确的位置,也是如此。

感谢。

2 个答案:

答案 0 :(得分:2)

听起来你只需要使用case语句而不是变量。然后,过程中的select语句将如下所示:

SELECT 
    C.CompanyName AS [Company], 
    RCG.Learner_Tag as [Registration Group], 
    convert(varchar(40), RQ.CreatedOn, 110) as [Date], 
    CASE WHEN RQ.Processed = 1 THEN 'Processed' ELSE 'Not Processed' END AS [Status] --this will display the text description for status
FROM ...

答案 1 :(得分:0)

在返回的集合中使用以下列作为列:

case RQ.Processed
  when 1 then 'Processed'
  else 'Not Processed'
end  as Status

当RQ.Processed等于1时,返回" Not Processed",当它等于其他任何东西时 - 包括NULL - 它返回" Not Procesed"。

同样地,作为附注,您可以使用where这样的句子删除IF / ELSE和duplciated查询:

when RQ.Processed = case @listAll
                      when 1 then RQ.Processed
                      else 0
                    end