SQL Server多次拆分单个列
发布时间:2020-12-12 08:56:59 所属栏目:MsSql教程 来源:网络整理
导读:我有一个数据库表,其中包含一个堆叠数据的列,其中包含两个级别,我希望打破一个部分.以下是数据示例(为保护无辜者而改变数据:): 表 ID = varchar(100)CarData = varchar(1000)ID CarData1 Nissan:blue:20000,Ford:green:100002 Nissan:steel:20001,Ford:blue:
我有一个数据库表,其中包含一个堆叠数据的列,其中包含两个级别,我希望打破一个部分.以下是数据示例(为保护无辜者而改变数据:):
表 ID = varchar(100) CarData = varchar(1000) ID CarData 1 Nissan:blue:20000,Ford:green:10000 2 Nissan:steel:20001,Ford:blue:10001,Chevy:blue:10000,Ford:olive:10000 ** Note that cardata can is not fixed,and can have many cars in it 输出所需: ID Manufacture Color Cost 1 Nissan Blue 20000 1 Ford green 10000 2 Nissan steel 20001 ... and on 所以说明白我需要打破第一个堆叠字段,这是一个逗号并为其创建一行,然后将第二个堆叠字段分解为列. 任何帮助将不胜感激. 解决方法-- Sample data declare @T table(ID int,CarData varchar(100)) insert into @T values (1,'Nissan:blue:20000,Ford:green:10000'),(2,'Nissan:steel:20001,Ford:olive:10000') -- Recursice CTE to get one row for each car ;with cte(ID,Car,CarData) as ( select ID,cast(substring(CarData+',',1,charindex(',CarData+',')-1) as varchar(100)),stuff(CarData,CarData),'')+',' from @T where len(CarData) > 0 union all select ID,cast(substring(CarData,CarData)-1) as varchar(100)),'') from cte where len(CarData) > 0 ) -- Use parsename to split the car data select ID,parsename(replace(Car,':','.'),3) as Manufacture,2) as Color,1) as Cost from cte order by ID 结果: ID Manufacture Color Cost -- ----------- ------ ----- 1 Nissan blue 20000 1 Ford green 10000 2 Nissan steel 20001 2 Ford blue 10001 2 Chevy blue 10000 2 Ford olive 10000 编辑1 如果颜色,成本或制造商名称包含a,那么你将遇到解析名称的问题.如果是这种情况,你应该尝试这样做. -- Sample data declare @T table(ID int,'') from cte where len(CarData) > 0 ) -- Split the car data with substring select ID,substring(Car,P1.Pos-1) as Manufacture,P1.Pos+1,P2.Pos-P1.Pos-1) as Color,P2.Pos+1,len(Car)-P2.Pos) as Cost from cte cross apply (select charindex(':',Car)) as P1(Pos) cross apply (select charindex(':',P1.Pos+1)) as P2(Pos) order by ID (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |