2014-02-27 55 views
0

我有这个问题: 对于每个以M和A开头的计划,我需要添加3个额外的字符并保留原文。此外,由T开始计划需要保持不变: 例如:Concat和循环函数

M_VA_K15CVA 
M_VA_M20CVA 
M_VA_T234 

应该

M_VA_K15CVA 
M_VA_K15CVA_V1 
M_VA_K15CVA_V2 
M_VA_K15CVA_V3 
M_VA_M20CVA 
M_VA_M20CVA_V1 
M_VA_M20CVA_V2 
M_VA_M20CVA_V3 
M_VA_TNT10-VA 

上我应该怎么用做这个文件的任何提示?谢谢

+0

哪个版本的SQL Server?假设'ROW_NUMBER()'可用,这将是'CASE'和'ROW_NUMBER()'的组合。 – Yuck

+0

这是一本教科书的例子,为什么你不应该把不同的数据连接成一个单独的字段,而应该把每个部分存储在不同的列中,并且在演示时将它们粘在一起。 –

回答

0

您可以通过加入具有丢失连接条件的派生表将列表展开成更大的列表。这里是符合你需求的代码,假设你的问题中你的意思是“M”和“K”,而不是“M”和“A”,这似乎不符合你的例子。

DECLARE @Plans TABLE 
(
    PlanID varchar(50) 
); 
INSERT INTO @Plans (PlanID) VALUES ('M_VA_K15CVA'); 
INSERT INTO @Plans (PlanID) VALUES ('M_VA_M20CVA'); 
INSERT INTO @Plans (PlanID) VALUES ('M_VA_T234'); 

SELECT 
    CASE 
     WHEN RowValue IS NULL OR RowValue = 0 THEN 
      PlanID 
     ELSE 
      PlanID + '_V' + CONVERT(varchar,RowValue) 
    END AS NewPlanID 
FROM  @Plans 
LEFT JOIN (
       SELECT 0 AS RowValue 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3 
      ) AS RowExpander 
ON   RIGHT(LEFT(PlanID,6),1) IN ('M','K');