Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да разделя полето за данни за символ на временна таблица на 5 колони?

Решението е лесно:

  1. разделете стойностите по \s (интервал) запазване на реда на елементите
  2. завъртете резултата
  3. извлечете само цифри или само букви от конкретната колона

За да разделите стойностите, можете да използвате XML като това . За да извлечете само числа, можете да извършите верига от REPLACE s премахване на всички единици. За да премахнете числата и да оставите текста, можете да използвате REPLACE s отново.

В моята среда използвам много SQL CLR функции и решението изглежда така:

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;

Можете да проверите това отговор, за да получите такива функции и във вашата среда.

Във вашия случай ще бъде по-лесно и по-безопасно да използвате XML за разделяне на данните и замяна за оформяне на резултатите.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NewSequentialId на UniqueIdentifier клъстерен индекс

  2. Функцията Contains() се проваля с низове от числа?

  3. Не може да се добави условие в частта FOR XML

  4. Вземете правилната част от низ в SQL Server (T-SQL)

  5. INSERT INTO @table_name...EXEC usp_name