首页 > 解决方案 > 循环在一列中的分隔列表

问题描述

正在将应用程序中的列从在固定宽度列中存储长字符串更新为分隔列。目前,我根据位置使用substring().

现在它正在更新为使用分隔符 (~) 来解析一列中的每个字段,我不确定如何提取数据并将它们写入另一个表中的各个字段。以下是示例数据和 T-SQL:

数据

Radio $7.00~Shirt $79.99~Late Fee $9.95~Small Hat $7.00~Taxes $0.19

SQL:

INSERT INTO TempTable2 (Offer1, Offer2)
    SELECT 
        SUBSTRING(OfferString, 1, 81) AS Offer1, 
        SUBSTRING(OfferString, 82, 81) AS Offer2
    FROM 
        TempTable

在固定宽度的方法中,我可以将每个单独的值存储到它们自己的列中,如上所述,但不确定如何继续使用新的基于分隔符的结构。

有人可以阐明一下吗?在 SQL Server 2008 R2 上运行。

标签: sqlsql-servertsql

解决方案


更新的版本有一个string_split()功能。这允许这种方法:

INSERT INTO TempTable2 (Offer1, Offer2)
    SELECT s.Offer1, s.Offer2
    FROM TempTable t CROSS APPLY
         (SELECT MAX(CASE WHEN seqnum = 1 THEN value END) as offer1,
                 MAX(CASE WHEN seqnum = 2 THEN value END) as offer2
          FROM (SELECT s.value,
                       ROW_NUMBER() OVER (ORDER BY CHARINDEX('~' + s.value + '~', '~' + t.OfferString + '~') as seqnum
                FROM string_split(t.OfferString, '~') s
               ) s
         ) s;

请注意,谣言也ORDER BY (SELECT NULL)将保留原始顺序。但是,该功能未记录在案。


推荐阅读