【问题标题】:Concat and loop functions连接和循环函数
【发布时间】:2014-02-27 18:28:18
【问题描述】:

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

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

关于我应该用什么来做这个文件的任何提示?谢谢

【问题讨论】:

  • SQL Server 的哪个版本?这将是CASEROW_NUMBER() 的组合,假设您可以使用ROW_NUMBER()
  • 这是一个教科书示例,说明为什么不应将不同的数据连接到单个字段中,而应将每个部分存储在不同的列中,并在演示时将它们重新组合在一起。

标签: sql-server loops concat


【解决方案1】:

您可以通过 JOIN 到具有丢失 JOIN 条件的派生表来将列表扩展为更大的列表。这是满足您需求的代码,假设您在问题中指的是“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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2012-09-16
    • 2020-03-18
    相关资源
    最近更新 更多