How to Replace %S with Feature Value on Feature String Based on Feature Name and partid?

ahmed salah 3,216 Reputation points
2022-06-09T17:50:14.997+00:00

I work on sql server 2017 i need write select query Replace %S with

Feature Value on Column Feature String Based On partid and Feature Name Related .

as example

partid 1211 have Feature String AC(%S)Boil(%S)Temp(%S)
I need to replace %S with Feature Value related to Feature Name For same Part so AC(%S) will be AC(5v)

and Boil(%S) will be Boil(10v)

and Temp(%S) will be Temp(5v)

so New Column Feature Value String will be AC(5V)Boil(10v)Temp(5V)

i have feature string like that AC(%S)Boil()Temp(%S)

so it will be as below

AC(5V)Boil()Temp(5V)

if i have feature string like that AC(%S)Boil(%S)

THEN it will be as

AC(5V)Boil(10v)

my sample data

    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)')  

final result

210211-replace-s-with-feature-value.png

Developer technologies | Transact-SQL
Developer technologies | Transact-SQL

A Microsoft extension to the ANSI SQL language that includes procedural programming, local variables, and various support functions.

SQL Server | Other
SQL Server | Other

Additional SQL Server features and topics not covered by specific categories

Locked Question. You can vote on whether it's helpful, but you can't add comments or replies or follow the question.

Answer accepted by question author
LiHong-MSFT 10,061 Reputation points
2022-06-10T07:28:44.6+00:00

Hi @ahmed salah
Check this query:

;WITH CTE1 AS  
(  
SELECT *,CASE WHEN CHARINDEX(FeatureName,FeatureString)>0 AND SUBSTRING(FeatureString,CHARINDEX(FeatureName,FeatureString)+LEN(FeatureName)+1,2)='%S'  
              THEN CONCAT(FeatureName,'(',FeatureValue,')')   
              WHEN CHARINDEX(FeatureName,FeatureString)>0 AND SUBSTRING(FeatureString,CHARINDEX(FeatureName,FeatureString)+LEN(FeatureName)+1,2)<>'%S'  
              THEN CONCAT(FeatureName,'()')  
              ELSE '' END AS FeatureValueString  
FROM #partsfeature  
)  
SELECT *,(SELECT STRING_AGG(FeatureValueString,'')WITHIN GROUP(ORDER BY FeatureValueString)   
                FROM CTE1 WHERE PartId = p.PartId) AS FeatureValueString  
FROM #partsfeature p  

If your SQL Sever don't support STRING_AGG, then try this:

;WITH CTE1 AS  
(  
SELECT *  
      ,CASE WHEN CHARINDEX(FeatureName,FeatureString)>0 AND SUBSTRING(FeatureString,CHARINDEX(FeatureName,FeatureString)+LEN(FeatureName)+1,2)='%S'  
                THEN CONCAT(FeatureName,'(',FeatureValue,')')   
                WHEN CHARINDEX(FeatureName,FeatureString)>0 AND SUBSTRING(FeatureString,CHARINDEX(FeatureName,FeatureString)+LEN(FeatureName)+1,2)<>'%S'  
                THEN CONCAT(FeatureName,'()')  
                ELSE '' END AS FeatureValueString  
FROM #partsfeature  
),CTE2 AS  
(  
SELECT B.PartId,STUFF((SELECT ''+FeatureValueString FROM CTE1 A WHERE A.PartId=B.PartId Order by featureName  
                                     FOR XML PATH('')),1,0,'') AS FeatureValueString   
FROM CTE1 B   
GROUP BY B.PartId  
)  
SELECT C.PartId,P.FeatureName,P.FeatureValue,FeatureString,FeatureValueString  
FROM CTE2 C INNER JOIN #partsfeature P on P.PartId=C.PartId  

Best regards,
LiHong

Was this answer helpful?

1 additional answer

Sort by: Most helpful
  1. Deleted

    This answer has been deleted due to a violation of our Code of Conduct. The answer was manually reported or identified through automated detection before action was taken. Please refer to our Code of Conduct for more information.

    1 deleted comment

    Comments have been turned off. Learn more