首页 > 解决方案 > 根据表中可用的列动态获取颜色

问题描述

有一个表格,每个产品都有独特的颜色范围,需要根据可用数量及时获取颜色。

你能帮我动态获取每种产品的颜色吗

create table test
(
    Product varchar(200)
    , Quantity int
    , RangeRed  varchar(200)
    , RangeYellow   varchar(200)
)

insert into test select 'A',10, '{value 1} <=5', '({value1} >5) and ({value1} <=10)'
insert into test select 'B',20, '{value 1} <=5', '({value1} >5) and ({value1} <=20)'
insert into test select 'C',50, '{value 1} <=5', '({value1} >5) and ({value1} <=10)'
insert into test select 'D',5, '{value 1} <=5', '({value1} >5) and ({value1} <=10)'

select Product, Quantity, case when RangeRed then 'Red' when RangeYellow then 'Yellow' else 'white' end as Color
select Product, Quantity,  
    Replace(RangeRed, '{value1}','Quantity')   as RangeRed
    , Replace(RangeYellow, '{value1}','Quantity')  as RangeYellow
from   test
) x

预期输出:

在此处输入图像描述

标签: sqlsql-server

解决方案


为此,您必须使用动态 SQL。下面是一个简单的示例,但您可能希望对其进行改进。

请注意,这是使用将多行结果连接到单个输出中的 hacky 形式。有更好的方法可以做到这一点,我留给你作为练习。

将有一个不需要将union所有行放在一起的解决方案,但它需要构建一个动态案例表达式来评估每个产品的条件。

create table #test
(
    Product varchar(200)
    , Quantity int
    , RangeRed  varchar(200)
    , RangeYellow   varchar(200)
)

insert into #test (Product, Quantity, RangeRed, RangeYellow)
values ('A', 10, '{Value1} <= 5', '({Value1} >5) and ({Value1} <=10)'),
('B', 20, '{Value1} <=5', '({Value1} >5) and ({Value1} <=20)'),
('C', 50, '{Value1} <=5', '({Value1} >5) and ({Value1} <=10)'),
('D', 5, '{Value1} <=5', '({Value1} >5) and ({Value1} <=10)')

declare @Sql nvarchar(max) = '';

select @Sql = @Sql + case when @Sql = '' then '' else ' union all ' end + 'select Product, Quantity, case when ' + replace(RangeRed,'{Value1}','Quantity') + ' then ''Red'' when ' + replace(RangeYellow,'{Value1}','Quantity') + ' then ''Yellow'' else ''White'' end Color from #test where Product = ''' + Product + '''' from #Test;

-- print @Sql; -- Debugging

exec (@Sql);

回报:

Product Quantity    Colour
A       10          Yellow
B       20          Yellow
C       50          White
D       5           Red

推荐阅读