使用 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)
有没有办法使用 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)