sql - 将具有不同长度分隔空格的字符串值拆分为三列
问题描述
我的 tableA col1 具有三个值,并由不同的长度分隔。我需要把它分成三列,分别放在 Z1、Z2 和 Z3 中。此外,在某些个人价值之间也有空格,例如“Windows XP Professional”,但我需要将其作为个人价值。有任何想法吗?请参阅下面的示例。谢谢。
当前的
Col Z1 Z2 Z3
-------------------------------------------------------------------------- ----- ----- ----
Windows XP Professional SP3 CD RWT-00543
Windows XP N/A N/A
Windows CE .NET v5.00 CD TRE-00298 in vault
Client Ctrl firmware N/A
后
Col Z1 Z2 Z3
------------------------------------ ------------- ----- ----
Windows XP Professional SP3 PP RWT-00543
Windows XP N/A N/A
Windows CE .NET v5.00 QQ TRE-00298 in vault
Client Ctrl firmware N/A
解决方案
STRING_SPLIT
不关心序数位置,所以在这里没有帮助。我建议获取一份DelimitedSplit8K_LEAD
. 然后你可以按如下方式拆分;
WITH Splits AS(
SELECT V.YourColumn,
DS.ItemNumber,
DS.Item,
ROW_NUMBER() OVER (PARTITION BY V.YourColumn ORDER BY DS.ItemNumber) AS RN
FROM (VALUES ('Windows XP Professional SP3 CD RWT-00543'),
('Windows XP N/A N/A'),
('Windows CE .NET v5.00 CD TRE-00298 in vault'),
('Client Ctrl firmware N/A')) V (YourColumn)
CROSS APPLY dbo.DelimitedSplit8K_LEAD(REPLACE(V.YourColumn, ' ', '|'), '|') DS
WHERE DS.Item NOT IN ('',' '))
SELECT MAX(CASE S.RN WHEN 1 THEN TRIM(S.Item)END) AS Z1,
MAX(CASE S.RN WHEN 2 THEN TRIM(S.Item)END) AS Z2,
MAX(CASE S.RN WHEN 3 THEN TRIM(S.Item)END) AS Z3
FROM Splits S
GROUP BY S.YourColumn;
GO
如果TRIM
不是找到的函数,请使用LTRIM
and RTRIM
。
推荐阅读
- r - 线性回归函数创建列表而不是模型
- angularjs - 如何检查角度承诺的状态?
- facebook - 使“应用程序”可用于其他人的页面
- c++ - Windows 注册表 EnableCursorSurpression 不适用于触摸输入
- java - 用于隐藏软件键盘的 KeyEvent 代码?
- python - 输入距离计算
- amazon-ec2 - 使用 Terraform 创建网络负载均衡器的问题
- python - 如何解决 FunctionError 和 MapError
- javascript - 无法从 JSON 文件中获取获取的数据到新函数中
- sql - 通过触发器更新另一个表,其中新值是 SELECT 查询的结果