sql >> Databasteknik >  >> RDS >> Sqlserver

Hur delar man upp symboldatafält på temptabellen till 5 kolumner?

Lösningen är enkel:

  1. dela upp värdena med \s (mellanslag) bevara ordningen på element
  2. pivotera resultatet
  3. 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.




  1. Visa data från anpassad fråga (sammanfogade tabeller) i liferay-sökbehållare

  2. Fråga som returnerar en hierarkisk lista över triggerhändelsetyper i SQL Server

  3. MySQL välj formaterat datum från millisekundsfältet

  4. Hur man upptäcker om ett värde innehåller minst en numerisk siffra i MySQL