SQL拆分字段 ITeyecsdn - 娱乐之横扫全球

SQL拆分字段 ITeyecsdn

2018-11-28 11:23:44 | 作者: 华晖 | 标签: 字段,运用,办法 | 浏览: 6749

拆分字段与兼并字段是字符串处理常见的两个问题,下面将针对实例进行剖析求解。
问题:將字符串拆分红記錄集
原表Table1(id int identity(1,1),name varchar(100))
id  name
-
1  a,b,c
2  e,f

期望得到成果:
id  name
-
1  a
1  b
1  c
2  e
2  f

一、首要咱们运用最原始的办法进行求解,即经过逐条循环来完成。
create table #a(id int identity(1,1),name varchar(100))
insert #a(name)
select a,b,c
union all select d,e,f
union all select g,h
1.运用游标
DECLARE @id int,@name varchar(100)
create table #b(id int,name varchar(100))
DECLARE a_cursor CURSOR FOR
SELECT id, name
FROM #a
ORDER BY id
 
OPEN a_cursor
 
FETCH NEXT FROM a_cursor
INTO @id, @name

WHILE @@FETCH_STATUS = 0
BEGIN
  while charindex(,,@name) 0
  begin
insert #b(id,name)
select @id,left(@name,charindex(,,@name)-1)
set @name=right(@name,len(@name)-charindex(,,@name))
  end
  insert #b(id,name)
  select @id,@name
  FETCH NEXT FROM a_cursor
  INTO @id, @name
end
CLOSE a_cursor
DEALLOCATE a_cursor

select *from #b
drop table #b
2.运用暂时表替代游标
DECLARE @id int,@name varchar(100),@count int
create table #tmp(no int identity(1,1),id int,name varchar(100))
create table #b(id int,name varchar(100))
insert #tmp(id,name)
select * from #a
set @count=@@rowcount
while @count 0
begin
  select @id=id,@name=name from #tmp where no=@count
  while charindex(,,@name) 0
  begin
insert #b(id,name)
select @id,left(@name,charindex(,,@name)-1)
set @name=right(@name,len(@name)-charindex(,,@name))
  end
  insert #b(id,name)
  select @id,@name
  set @count=@count-1
end

select * from #b order by id,name
drop table #b,#tmp
上述两种办法都两次运用了循环,明晰易懂,但代码长并且速度慢。

二、运用replace函数与动态句子结合。
test:
create table #a(id int identity(1,1),name varchar(100))
create table #b(id int,name varchar(100))
insert #a(name)
select a,b,c
union all select d,e,f
union all select g,h
go
declare @sql varchar(8000)
set @sql =
select @sql = @sql + insert into #b select + cast(id as varchar) + , + replace(name,,, union all select + cast(id as varchar) + ,) + from #a
print @sql
exec (@sql)
go
select * from #b
go
drop table #a,#b

解析:此段代码很简练,但运用了比较复杂的动态句子与替代函数的运用技巧,给程序的解读带来必定的困难,并且受字段串长度的约束,
一旦超越8000个字符就不能满足要求。

三、运用substring函数计算出每一段切割符的上下方位,然后到达别离字段的意图。
此办法能够处理较大数据量的要求并且速度较快,但此办法比较奇妙,难以联想到。
create table #a(id int identity(1,1),name varchar(100))

insert #a(name)
select a,b,c
union all select d,e,f
union all select g,h

select a.id,name=substring(a.name,b.id,charindex(,,a.name+,,b.id)-b.id)
from #a a join(
select top 100 id=a.id+b.id+1
from(
  select id=0 union all select 1
  union all select id=2 union all select 3
  union all select id=4 union all select 5
  union all select id=6 union all select 7
  union all select id=8 union all select 9
) a,(
  select id=0 union all select 10
  union all select id=20 union all select 30
  union all select id=40 union all select 50
  union all select id=60 union all select 70
  union all select id=80 union all select 90
) b
)b on substring(,+a.name,b.id,1)=,

drop table #a
归纳起来,上述三种办法比较:
第一种通俗易懂,契合一般人的编写思维,但功率不高。
第二种办法句子言简意赅,较率也较高,但由于受字符串长度约束,通用性欠好,难以处理大批量的数据。
第三种办法弥补了第二种办法的缺乏,但一起加进了程序的复杂度,不是很简单想得到,想得通。

四、 Ntext字段的拆分

if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N[dbo].[f_GetStr])  and  xtype  in  (NFN,  NIF,  NTF)) 
  drop  function  [dbo].[f_GetStr] 
  GO 
 
  /*得到字符串列表指定方位的字符 
 
  能够自定义字符串列表的分隔符 
  假如取数方位超出的规模,回来空字符串 
 
  邹建  2005.04(引证请保存此信息)*/ 
 
  /*调用示例 
  测试数据 
  declare  @UserItem  table(UserItemID  int,CateName  varchar(50),OtherDemo  text) 
  insert  @UserItem 
  select  1,张三,50 黄石市小河镇 0762-2262626  union  all 
  select  2,李四,35 广州市 020-2262626  union  all 
  select  3,博士,25 青岛 0456-2262626  union  all 
  select  4,学士,25 北京 010-2262626 
 
  分拆 
  select  UserItemID,CateName 
  ,年纪=dbo.f_GetStr(OtherDemo,1) 
  ,地址=dbo.f_GetStr(OtherDemo,2) 
  ,联系电话=dbo.f_GetStr(OtherDemo,3) 
  from  @UserItem 
 
  /*成果 
 
  UserItemID  CateName  年纪  地址  联系电话 
  -      -  - 
  1  张三  50  黄石市小河镇  0762-2262626 
  2  李四  35  广州市  020-2262626 
  3  博士  25  青岛  0456-2262626 
  4  学士  25  北京  010-2262626 
 
  (所影响的行数为  4  行) 
  */ 
  */ 
  CREATE  FUNCTION  f_GetStr( 
  @s  ntext,  字符串列表 
  @pos  int  要获取的数据信息段 
  )RETURNS  nvarchar(4000) 
  AS 
  BEGIN 
  IF  @s  IS  NULL  RETURN(NULL) 
  DECLARE  @s1  nvarchar(4000),@i  int,@j  int 
  SELECT  @i=1,@j=PATINDEX(% %,@s) 
  WHILE  @pos 1  AND  @j 0 
  SELECT  @pos=@pos-1, 
  @j=PATINDEX(% %,SUBSTRING(@s,@i,4000)) 
  ,@i=@i+@j 
  RETURN(SUBSTRING(@s,@i,PATINDEX(% %,SUBSTRING(@s,@i,4000)+ )-1)) 
  END 
  GO
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章