日期:2014-05-17  浏览次数:20466 次

字符串提取问题
本帖最后由 itsong 于 2012-11-07 20:41:10 编辑
有一列数据,内容为"某单位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