Lösningen är enkel:
- dela upp värdena med
\s
(mellanslag) bevara ordningen på element - pivotera resultatet
- extrahera endast siffror eller endast bokstäver från den specifika kolumnen
För att dela upp värdena kan du använda XML
gillar detta
. För att bara extrahera siffror kan du utföra en kedja av REPLACE
s ta bort alla enheter. För att ta bort siffrorna och lämna texten kan du använda REPLACE
s igen.
I min miljö använder jag många SQL CLR-funktioner och lösningen ser ut så här:
SELECT PVT.id
,PVT.symbolData
,dbo.fn_Utils_RegexReplace ([0], '[^\d+]', '') AS [valuebefore]
,dbo.fn_Utils_RegexReplace ([0], '\d+', '') AS [unitbefore]
,[1] AS [symbole]
,dbo.fn_Utils_RegexReplace ([2], '[^\d+\.]', '') AS [valueafter]
,dbo.fn_Utils_RegexReplace ([2], '[\d+\.]', '') AS [unitafter]
FROM #TEMP
CROSS APPLY dbo.fn_Utils_RegexSplitWithOrder (SymbolData, '\s') RS
PIVOT
(
MAX([value]) FOR [index] IN ([0], [1], [2])
) PVT
ORDER BY PVT.id;
Du kan kolla detta svar för att få sådana funktioner i din miljö också.
I ditt fall blir det enklare och säkrare att använda XML för att dela upp data och ersätta för att forma resultaten.