如何将 temp table 上的符号数据字段拆分为 5 列?

How to split symbol data field on temp table to 5 columns?

我在处理 SQL Server 2012 查询时遇到一个问题:我无法将临时 table 字段符号数据拆分为 5 列。

请问怎么做?

CREATE TABLE #TEMP
(
    id INT IDENTITY(1,1),
    SymbolData  NVARCHAR(50)
)

INSERT INTO #TEMP (SymbolData)
VALUES ('0Hz ~ 4.5kHz'), ('0Hz | 9kHz'),
       ('0V - 4.5vl'), ('0Hz . 4.5kHz')

SELECT * FROM #TEMP

如何将列Symbol Data分成5列

valuebefore unitbefore symbole valueafter unitafter
----------------------------------------------------
0            Hz           ~    4.5         Hz 
0            Hz           |     9          kHz 
0            V            -    4.5         vl
0            Hz           .    4.5         kHz 

temp table 列中的每一行 SymbolData 都有一个符号或字符,例如 | 或 - 等。

我需要将该列 SymbolData 分成 5 个部分,每个部分代表列:

解决方法很简单:

  1. \s(space) 保留元素顺序拆分值
  2. 旋转结果
  3. 从特定列中仅提取数字或字母

为了拆分值,您可以像 一样使用 XML。为了仅提取数字,您可以执行一系列 REPLACEs 删除所有单位。为了去除数字并保留文本,您可以再次使用REPLACEs。

在我的环境中,我使用了很多 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 拆分数据并替换以调整结果会更容易和更安全。