首页 > 解决方案 > 将具有不同长度分隔空格的字符串值拆分为三列

问题描述

我的 tableA col1 具有三个值,并由不同的长度分隔。我需要把它分成三列,分别放在 Z1、Z2 和 Z3 中。此外,在某些个人价值之间也有空格,例如“Windows XP Professional”,但我需要将其作为个人价值。有任何想法吗?请参阅下面的示例。谢谢。

当前的

Col                                                                            Z1       Z2     Z3
--------------------------------------------------------------------------   -----    -----   ----  

Windows XP Professional     SP3                       CD RWT-00543
Windows XP                    N/A                          N/A
Windows CE .NET             v5.00               CD TRE-00298 in vault
Client Ctrl firmware      N/A

Col                                          Z1                   Z2              Z3
------------------------------------     -------------          -----           ----
                                      Windows XP Professional     SP3        PP RWT-00543
                                         Windows XP               N/A             N/A
                                       Windows CE .NET           v5.00       QQ TRE-00298 in vault
                                        Client Ctrl firmware      N/A

标签: sqltsql

解决方案


STRING_SPLIT不关心序数位置,所以在这里没有帮助。我建议获取一份DelimitedSplit8K_LEAD. 然后你可以按如下方式拆分;

WITH Splits AS(
    SELECT V.YourColumn,
           DS.ItemNumber,
           DS.Item,
           ROW_NUMBER() OVER (PARTITION BY V.YourColumn ORDER BY DS.ItemNumber) AS RN
    FROM (VALUES ('Windows XP Professional     SP3                       CD RWT-00543'),
                 ('Windows XP                    N/A                          N/A'),
                 ('Windows CE .NET             v5.00               CD TRE-00298 in vault'),
                 ('Client Ctrl firmware      N/A')) V (YourColumn)
         CROSS APPLY dbo.DelimitedSplit8K_LEAD(REPLACE(V.YourColumn, '  ', '|'), '|') DS
    WHERE DS.Item NOT IN ('',' '))
SELECT MAX(CASE S.RN WHEN 1 THEN TRIM(S.Item)END) AS Z1,
       MAX(CASE S.RN WHEN 2 THEN TRIM(S.Item)END) AS Z2,
       MAX(CASE S.RN WHEN 3 THEN TRIM(S.Item)END) AS Z3
FROM Splits S
GROUP BY S.YourColumn;
GO

如果TRIM不是找到的函数,请使用LTRIMand RTRIM


推荐阅读