我有一个列表名为ID
的列表ID
0688E0734 0688F073
0781B0713
0958F02134 0958F03124 0958G033
...
我想以下列方式将各个ID拆分为不同的行:
ID
0688E0734
0688F073
0781B0713
0958F02134
0958F03124
0958G033
当同一行中有多个ID时,它们会被3,4或5个空格分开。
我尝试过做
select replace(replace(ID,' ',','),' ','') from Tickets
这给了我
0748A014,0748A0212,
0747F0124,0747G0113,
0777A054,0777A0624,0777A072,0777B071
但是现在,我很困惑如何将多行拆分成更多行 任何帮助表示赞赏。
答案 0 :(得分:0)
我通常更喜欢使用XML
将CSV列表拆分为表值格式。你可以检查这个功能:
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
以及以下article了解更多显示如何执行此操作的技巧。然后,您只需使用CROSS APPLY
子句来应用该函数。
SELECT f.item
FROM myTable
CROSS APPLY dbo.SplitStrings_XML (',', myTable.column) f
现在,您已将spaces
替换为commas
。如果您可以使用1到X空格并且不想像显示的那样替换它,则可以用逗号替换空格。然后您的数据将如下所示(例如):
0748A014,,,0748A0212,,,
0747F0124,,0747G0113,,,
0777A054,,,,,,0777A0624,,,0777A072,,,0777B071
只需添加一个排除空字符串的where
分段就可以了。它将是这样的:
SELECT f.item
FROM myTable
CROSS APPLY dbo.SplitStrings_XML (',', REPLACE(myTable.column,' ', ',') f
WHERE LEN(f.item) <> 0
答案 1 :(得分:0)
您得到的是一个表,其中多个ID在单个列中编码为字符串。在关系数据库世界中非常糟糕。我建议您将此表命名为“Source”,并使用适当类型的列ID创建另一个表目标。这可能也是字符串或它的外观我看到你的字符串可能是十六进制数字。在这种情况下,您可以使用64位类型的big int。
您必须将Source中的数据转换为某种可管理的形式。我会建议多次通过你在第一次通过用“,”代替“”(5个空格)。在下一个过程中,您将用“m”替换“”(4个空白),依此类推。如果ID之间存在未知数量的空格,则可能需要找到更一般的解决方案。
从那时起,您使用技术将数据从Source插入目标,并在答案中向您展示。
还有一件事:如果您的原始数据是某种文本文件格式,您可以使用一些文本编辑工具来减少空白并将其转换为换行符然后导入它。