如何将 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 个部分,每个部分代表列:
- 获取列符号之前的值作为之前的值
- 获取列符号之前的单位作为之前的单位
- 获取列上的符号作为符号
- 获取列符号后的值作为
后的值
- 获取列上符号后的单位作为
后的单位
解决方法很简单:
- 按
\s
(space) 保留元素顺序拆分值
- 旋转结果
- 从特定列中仅提取数字或字母
为了拆分值,您可以像 一样使用 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 拆分数据并替换以调整结果会更容易和更安全。
我在处理 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 个部分,每个部分代表列:
- 获取列符号之前的值作为之前的值
- 获取列符号之前的单位作为之前的单位
- 获取列上的符号作为符号
- 获取列符号后的值作为 后的值
- 获取列上符号后的单位作为 后的单位
解决方法很简单:
- 按
\s
(space) 保留元素顺序拆分值 - 旋转结果
- 从特定列中仅提取数字或字母
为了拆分值,您可以像 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 拆分数据并替换以调整结果会更容易和更安全。