我想将|
分隔的字符串分隔为新列,我尝试了以下代码,但我认为这不是一个好习惯。
SELECT
REPLACE(SUBSTRING(ReferenceName, 1, CHARINDEX('|', ReferenceName)), '|', '') AS CreditCard,
ReferenceName
FROM
CTS.DBO.cts_TxSalesPayment
预期结果
根据分隔符拆分值:
CardNumber | ExpiryDate | ApprovalCode | .... | ... | ... | ...
答案 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;