最近工作中遇到一个问题,就是将人名和身份证字符串进行分割,并且还要一一对应,看下列需求示例:
NAME:张三、李四、王五 IDCARD:4400001、4400002、4400003
处理要求: NAME IDCARD
张三 4400001
李四 4400002
王五 4400003
人名跟身份证是有、号分割,并且不是固定3个人为一组,可能有十多个人拼凑在一起,怎么办?后来经过一些调试和试验,终于找到能解决的办法,由于我不喜欢写函数和存储过程,解决办法以SQL查询脚本呈现,如有需要写成存储过程或函数的朋友可以联系本人。
解决办法
Declare @str varchar(8000)--人名的字符串
Declare @sfzstr varchar(8000)--身份证的字符串
Declare @spli varchar(10)--字符串分隔符
Declare @i int,@splen int,@ncount int ,@scount int --定义变量
Declare @name table(ID Int IDENTITY (1, 1),NAME varchar(8000))
Declare @sfz table(ID Int IDENTITY (1, 1),IDCARD varchar(8000))
set @str='张三、李四、王五'
set @sfzstr='4400001、4400002、4400003'
set @spli='、' --设置分割符号
set @ncount=0
set @scount=0
--分割权属人
select @splen=len(@spli),@i=charindex(@spli,@str)
while @i>0
begin
insert into @name values(left(@str,@i-1)) --循环截取
select @str=substring(@str,@i+@splen,8000),@i=charindex(@spli,@str)
set @ncount=@ncount+1
end
if @str<>'' insert into @name values(@str) set @ncount=@ncount+1
--分割身份证
select @splen=len(@spli),@i=charindex(@spli,@sfzstr)
while @i>0
begin
insert into @sfz values(left(@sfzstr,@i-1)) --循环截取
select @sfzstr=substring(@sfzstr,@i+@splen,8000),@i=charindex(@spli,@sfzstr) set @scount=@scount+1
end
if @sfzstr<>'' insert into @sfz values(@sfzstr) set @scount=@scount+1
--------------------------------------------------------------------------------------
if (@ncount>=@scount) --防止人名或身份证没有对应的项,以‘缺’表示
select a.ID,a.NAME,isnull(b.IDCARD,'缺') from @name a left join @sfz b on a.ID=b.ID
else
select b.ID,isnull(a.NAME,'缺'),b.IDCARD from @sfz b left join @name a on a.ID=b.ID
执行语句后完美解决上述要求。
注意提示
我在代码增加了一种情况的处理,就是当出现以下情况时:
NAME:张三、李四 IDCARD:4400001、4400002、4400003
则查询出来为
NAME IDCARD
张三 4400001
李四 4400002
缺 4400003