使用 case 语句显示 select 语句中的某些列

Using a case statement to show certain columns in select statement

有没有办法使用 CASE 语句来显示 select 语句中的某些列?

目前我正在使用以下 SQL 来执行此操作

BEGIN
IF( @ISUSERROLE = 1)
     SELECT 
    t       PONumber                      = [RAH_PONumber]
           ,RAType                       = rt.[RAT_Type]
           ,ChargeableAmount             = [RAH_ChargeableAmount]
     FROM [T_RA_Header] rh
     INNER JOIN dbo.T_RA_Type rt ON rt.RAT_ID = rh.[RAH_RAT_ID]
     INNER JOIN dbo.T_RA_Status rs ON rs.RAS_ID = rh.[RAH_RAS_ID]
     WHERE
          rh.RAH_RAI_ID = @RAI_ID

    ELSE IF (@ISUSERROLE = 2)
          SELECT   
           PONumber                     = [RAH_PONumber]
          ,RANumber                     = [RAH_RANumber]
          ,RAType                       = rt.[RAT_Type]
          ,RAStatus                     = rs.RAS_Status
          ,RAUploadedBy                 = [RAH_UploadedByUserName]
          ,UploadedOn                   = [RAH_UploadedOn]
          ,ChargeableAmount             = [RAH_ChargeableAmount]

     FROM [T_RA_Header] rh
     INNER JOIN dbo.T_RA_Type rt
          ON rt.RAT_ID = rh.[RAH_RAT_ID]
     INNER JOIN dbo.T_RA_Status rs
          ON rs.RAS_ID = rh.[RAH_RAS_ID]
     WHERE
          rh.RAH_RAI_ID = @RAI_ID
END

从这里可以使用CASE语句吗??或者是我所做的唯一方法

一个SQL查询returns一组明确定义的列。您不能更改列的数量、类型或名称,但可以更改内容。

CASE是returns单个值的表达式,可以是结果集中的一列。

因此,您不能使用 CASE 更改列数。

您唯一的选择是动态 SQL,您可以在查询字符串中设置所需的列,然后执行查询字符串。

case

declare @ISUSERROLE int = 1
declare @select_1 varchar(2000)
declare @select_2 varchar(2000)
declare @main_sql varchar(4000)
declare @final_set varchar(8000)

set @select_1 = 'PONumber = [RAH_PONumber],
                 RAType = rt.[RAT_Type],
                 ChargeableAmount = [RAH_ChargeableAmount]'

set @select_2 = 'PONumber= [RAH_PONumber],
                 RANumber= [RAH_RANumber],
                 RAType  = rt.[RAT_Type],
                 RAStatus= rs.RAS_Status,
                 RAUploadedBy= [RAH_UploadedByUserName],
                 UploadedOn= [RAH_UploadedOn],
                 ChargeableAmount = [RAH_ChargeableAmount]'

set @main_sql = ' FROM [T_RA_Header] rh
                INNER JOIN dbo.T_RA_Type rt
                 ON rt.RAT_ID = rh.[RAH_RAT_ID]
                INNER JOIN dbo.T_RA_Status rs
                 ON rs.RAS_ID = rh.[RAH_RAS_ID]
                WHERE
                 rh.RAH_RAI_ID = '+convert(varchar,@RAI_ID)+''


set @final_set = 'select '+case  when @ISUSERROLE  = 1 then @select_1 else @select_2 end+@main_sql
--print @final_set
exec (@final_set)