我需要编写一个 select 语句,将列%S
中的字符串替换为FeatureString
存储在同一表中给定的实际值PartID
。
使用以下示例数据:
+--------+--------------+---------------+------------------------+
| PartID | FeatureName | FeatureValue | FeatureString |
+--------+--------------+---------------+------------------------+
| 1211 | AC | 5V | AC(%S)Boil(%S)Temp(%S) |
| 1211 | Boil | 10v | AC(%S)Boil(%S)Temp(%S) |
| 1211 | Temp | 5V | AC(%S)Boil(%S)Temp(%S) |
+--------+--------------+---------------+------------------------+
我想检索以下内容FeatureValueString
:
+--------+-------------------------+
| PartID | FeatureName |
+--------+-------------------------+
| 1211 | AC(5V)Boil(10v)Temp(5V) |
+--------+-------------------------+
解释
我需要用存储在相应列组合中的值替换%S
部分。FeatureString
FeatureName
FeatureValue
最后一个PartID
带有值7791
的情况有点特殊,因为它只需要存储在表中的两个值。这些是AC
和Boil
。返回的值Temp
不需要FeatureString
。
样本数据
create table #partsfeature
(
PartId int,
FeatureName varchar(300),
FeatureValue varchar(300),
FeatureString varchar(300)
)
insert into #partsfeature(PartId,FeatureName,FeatureValue,FeatureString)
values
(1211,'AC','5V','AC(%S)Boil(%S)Temp(%S)'),
(1211,'Boil','10v','AC(%S)Boil(%S)Temp(%S)'),
(1211,'Temp','5V','AC(%S)Boil(%S)Temp(%S)'),
(2421,'grail','51V','Alc(%S)Coil(%S)grail(%S)'),
(2421,'Coil','9V','Alc(%S)Coil(%S)grail(%S)'),
(2421,'Alc','5V','Alc(%S)Coil(%S)grail(%S)'),
(6211,'compress','33v','compress(%S)heat(%S)push(%S)'),
(6211,'heat','90v','compress(%S)heat(%S)push(%S)'),
(6211,'push','80v','compress(%S)heat(%S)push(%S)'),
(5442,'compress','33v','compress(%S)heat()push(%S)'),
(5442,'heat','90v','compress(%S)heat()push(%S)'),
(5442,'push','80v','compress(%S)heat()push(%S)'),
(7791,'AC','5V','AC(%S)Boil(%S)'),
(7791,'Boil','10v','AC(%S)Boil(%S)'),
(7791,'Temp','5V','AC(%S)Boil(%S)'),
(8321,'Angit','50V','Angit(%S)Fan(%S)Hot(%S),Wether(%S)'),
(8321,'Fan','9v','Angit(%S)Fan(%S)Hot(%S),Wether(%S)'),
(8321,'Hot','3V','Angit(%S)Fan(%S)Hot(%S),Wether(%S)'),
(8321,'Wether','12V','Angit(%S)Fan(%S)Hot(%S),Wether(%S)')
预期结果截图
可以有三个以上的特征。
一种解决方案:
另一个使用递归替换:
db<>fiddle 在线演示