有一列数据,内容为"某单位01 姓名"、"某某单位101 姓名”……
内容特征是先为长度不等的汉字,随后为一组长度不等的阿拉伯数字作为编号,紧接着是空格
实现目标:将该列输出为三列内容,单位名称,编号,姓名
好像SQL SERVER自身不支持正是表达式,使用CLR倒是可以做用户自定义函数实现正则表达式,但不更于部署和数据的转移,求高手指点更好解决办法
------解决方案--------------------
declare @str varchar(50)
set @str='上海市办事处客户办工单位00100 诸葛財大气粗'
select left(@str,patindex('%[0-9]%',@str)-1) as 单位,
SUBSTRING(@str,patindex('%[0-9]%',@str),LEN(@str)-len(left(@str,patindex('%[0-9]%',@str)-1))-len(right(@str,patindex('%[0-9]%',reverse(@str))-1))) as 编号,
right(@str,patindex('%[0-9]%',reverse(@str))-1) as 姓名
------解决方案--------------------
declare @str varchar(50)
set @str='某某单位101 姓名'
select substring(@str,1,patindex('%[0-9]%',@str)-1) as 单位,
substring(@str,patindex('%[0-9]%',@str),len(@str)-patindex('%[ ]%',reverse(@str))-(patindex('%[0-9]%',@str)-1))as 编号,
right(@str,patindex('%[0-9]%',reverse(@str))-1) as 姓名
/*
------ -------- -------
单位 编号 姓名
某某单位 101 姓名
*/
------解决方案--------------------
declare @str varchar(255)
set @str='四川省委101 姓名'
select
left(@str,patindex('%[0-9]%',@str)-1) as Company,
SUBSTRING(@str,patindex('%[0-9]%',@str),LEN(@str)-patindex('%[0-9]%',@str)+2-patindex('%[0-9]%',REVERSE(@str))) as Userid,
RIGHT(@str,CHARINDEX(' ',REVERSE(@str))-1) as 姓名
/*
Company Userid 姓名
四川省委 101 姓名
*/
------解决方案--------------------
select LEFT(列名,b.number),
SUBSTRING(列名, b.number+1,c.number-b.number),
right(列名,len(列名)-c.number),
a.* from 表名 a,master..spt_values b,master..spt_values c
WHERE b.type='P' and c.type='P'
and ASCII(substring(列名,b.number,1))>128 and ASCII(substring(列名,b.number+1,1))<128
and ASCII(substring(列名,c.number+1,1))=32