将分隔值拆分为新的单列

时间:2017-06-05 04:16:17

标签: sql-server sql-server-2014

我想将|分隔的字符串分隔为新列,我尝试了以下代码,但我认为这不是一个好习惯。

SELECT 
    REPLACE(SUBSTRING(ReferenceName, 1, CHARINDEX('|', ReferenceName)), '|', '') AS CreditCard, 
    ReferenceName
FROM  
    CTS.DBO.cts_TxSalesPayment

enter image description here

预期结果

根据分隔符拆分值:

CardNumber | ExpiryDate | ApprovalCode | .... | ... | ... | ...

1 个答案:

答案 0 :(得分:0)

一种方法是使用REPLACE函数允许将列解析为XML,然后将结果PIVOT。

例如:

DECLARE @T TABLE (ReferenceName VARCHAR(MAX));
INSERT @T VALUES ('CardNumber=asdf|ExpiryDate=1234124x|ApprovalCode=aaaaa'), ('CardNumber=zzz|ExpiryDate=123|ApprovalCode=q'), ('CardNumber=zzz|ExpiryDate=111|ApprovalCode=q2');

SELECT *
FROM
(
    SELECT RN, colName = A.B.value('local-name(.)', 'varchar(max)'), colVal = A.B.value('@val', 'varchar(max)')
    FROM 
    (
        SELECT RN = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), col = CAST('<' + REPLACE(REPLACE(ReferenceName, '=', ' val='''), '|', '''/><') + ''' />' AS XML)
        FROM @T
    ) AS T
    CROSS APPLY col.nodes('*') AS A(B)
) AS T
PIVOT
(
    MAX(colVal) FOR colName IN ([CardNumber], [ExpiryDate], [ApprovalCode])
) AS P;