php数据库数据分割,数据库表字段数据分割问题

本文介绍了在数据库管理中,为减少存储记录数而将多条记录合并为一条的情况,特别是在人事管理系统中,部门相关人的ID被存储在同一个字段,用逗号分隔。现在的需求是将这些合并的记录按ID字段拆分成多条记录。通过创建一个自定义的SQL字符串分割函数,并结合游标遍历原表,将每个ID字段拆分并插入到新的记录中,最终实现了记录的拆分显示。
摘要由CSDN通过智能技术生成

有的时候为了减少存储记录数,可能会把多条记录合并为一条显示。这种情况的发生主要体现上记录在表的其它字段都相同,只有某一个字段是变化的这种情况,例如人事管理中,部门中的相关人的ID都放在一条记录的一个字段中,中间用逗号隔开。现在的需求就是要将

有的时候为了减少存储记录数,可能会把多条记录合并为一条显示。这种情况的发生主要体现上记录在表的其它字段都相同,只有某一个字段是变化的这种情况,例如人事管理中,部门中的相关人的ID都放在一条记录的一个字段中,中间用逗号隔开。现在的需求就是要将一条记录按ID字段分割成多条记录。

CREATE TABLE [dbo].[Table_Dept](

[DEPT_CODE] [int] NULL,

[content] [nvarchar](50) NULL,

[A0188s] [nvarchar](max) NULL

) ON [PRIMARY]

GO

insert into Table_Dept select 1000,'总务系','350,688,258' union all select 1001,'总经理室','2,3,4,298'

查询该表结果如下,其中DEPT_CODE部门编码,content是部门名称,A0188s是相关人。

7a8b159c0da17f41cfba5b2f873d45a3.png

现在需要将A0188s中的ID分解为多条显示。考虑采用自定义字符串分割函数实现,分割函数脚本:

CREATE FUNCTION [dbo].[Split]

(

@c VARCHAR(MAX) ,

@split VARCHAR(50)

)

RETURNS @t TABLE ( col VARCHAR(50) )

AS

BEGIN

WHILE ( CHARINDEX(@split, @c) <> 0 )

BEGIN

INSERT @t( col )

VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )

SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')

END

INSERT @t( col ) VALUES ( @c )

RETURN

END

但是该函数只能处理单条记录,这里考虑采用游标遍历原表,逐个分解然后存储到临时表中。

IF object_id('tempdb..#TEMPTB1') is not null

BEGIN

drop table #TEMPTB1

END

CREATE table #TEMPTB1

(

[DEPT_CODE] [int] NULL,

[content] [nvarchar](50) NULL,

[A0188s] [nvarchar](max) NULL

)

IF object_id('tempdb..#TEMPTB2') is not null

BEGIN

drop table #TEMPTB2

END

CREATE table #TEMPTB2

(

[pid] [nvarchar](max) NULL

)

declare @DEPT_CODE int

declare @content varchar(50)

declare @A0188s varchar(max)

exec('declare my_cursor1 cursor for select * from [Table_Dept]')

open my_cursor1

declare @id1 sysname

declare @id2 sysname

declare @id3 sysname

fetch next from my_cursor1 into @id1,@id2,@id3

while(@@fetch_status= 0)

begin

set @DEPT_CODE =convert(int,@id1)

set @content =convert(varchar(50),@id2)

set @A0188s =convert(varchar(max),@id3)

truncate table #TEMPTB2

insert into #TEMPTB2 select * from Split(@A0188s,',')

insert into #TEMPTB1 select @DEPT_CODE,@content,pid from #TEMPTB2

fetch next from my_cursor1 into @id1,@id2,@id3

end

close my_cursor1

deallocate my_cursor1

select * from #TEMPTB1

得到最终结果

890f42e55011aaae3a535dc73aeb33b9.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值