Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment diviser le champ de données de symbole sur la table temporaire en 5 colonnes ?

La solution est simple :

  1. diviser les valeurs par \s (espace) préservation de l'ordre des éléments
  2. faire pivoter le résultat
  3. extraire uniquement des chiffres ou uniquement des lettres de la colonne spécifique

Afin de diviser les valeurs, vous pouvez utiliser XML comme ceci . Afin d'extraire uniquement des nombres, vous pouvez effectuer une chaîne de REPLACE s suppression de toutes les unités. Pour supprimer les chiffres et laisser le texte, vous pouvez utiliser REPLACE à nouveau.

Dans mon environnement, j'utilise beaucoup de fonctions SQL CLR et la solution ressemble à ceci :

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;

Vous pouvez vérifier ceci réponse pour obtenir de telles fonctions dans votre environnement également.

Dans votre cas, il sera plus facile et plus sûr d'utiliser XML pour diviser les données et les remplacer pour façonner les résultats.