当前位置: 代码迷 >> Sql Server >> 在有汉字和数字组成的字段中,怎么只提取字段中的数字
  详细解决方案

在有汉字和数字组成的字段中,怎么只提取字段中的数字

热度:39   发布时间:2016-04-24 09:12:00.0
在有汉字和数字组成的字段中,如何只提取字段中的数字,
原来的表为:


使用:  update dbo.a set youbian=REVERSE(SUBSTRING(REVERSE(zuozhedanwei),charINDEX('%[0-9]%',REVERSE(zuozhedanwei))+1,3))

最后得到的是:

这不是我想的结果,我想如何没有数字的话,则邮编一列为空,而不是汉字,求大牛来解答!!

------解决思路----------------------

-- 使用自定义的函数

create table test(id int , c1 varchar(20) , c2 varchar(20))
go
insert into test(id,c1) values(1,'河石家庄'),(2,'石家庄123'),(3,'石家庄1234X')
go
create function fn_getnumber(@str varchar(100))
returns varchar(100)
begin
    declare @return varchar(100) = ''
    declare @temp varchar(2)
    while LEN(@str) > 0 
    begin
        set @temp = SUBSTRING(@str,1,1)
        if @temp between '0' and '9' 
        select @return = @return + @temp
        set @str = SUBSTRING(@str,2,len(@str))
    end
    return @return
end
go
select * from test 
go
update test set c2 = dbo.fn_getnumber(c1)
go
select * from test 
go
drop table test
go
drop function fn_getnumber
go


(3 行受影响)
id          c1                   c2
----------- -------------------- --------------------
1           河石家庄                 NULL
2           石家庄123               NULL
3           石家庄1234X             NULL

(3 行受影响)


(3 行受影响)
id          c1                   c2
----------- -------------------- --------------------
1           河石家庄                 
2           石家庄123               123
3           石家庄1234X             1234

(3 行受影响)



------解决思路----------------------

USE [AdventureWorks2012];
GO
DECLARE @t_TB TABLE
(
   COL VARCHAR(20)
)
;

INSERT INTO @t_TB VALUES
('ABC123')
,('ENA329')
,('EEE22W33')
,('F1W2C3E8')
,('DDDDDDD')
;

SELECT col,LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1)  as new_num
FROM (
    SELECT col,subsrt = SUBSTRING(col, pos, LEN(col))
    FROM (
        SELECT col, pos = PATINDEX('%[0-9]%', col)
        FROM @t_TB
    ) d
) t
/*
col                  new_num
-------------------- --------------------
ABC123               123
ENA329               329
EEE22W33             22
F1W2C3E8             1
DDDDDDD              
*/
  相关解决方案