如何在sql server 2005中使用正则表达式?

时间:2013-10-03 16:43:26

标签: sql regex sql-server-2005

我需要你的帮助。

使用SQL Server 2005中的正则表达式,我获得邮政地址的门牌号码。一切正常。但我在某些方向上遇到了问题。

例如,我的地址为Florecita Terrace 1746-B floor 3,您获得的住房数量为1746-B,但相同的地址可以写成如下:Florecita Terrace 1746 B floor 3并按此方向获取门牌号1746并丢失了B字母,因为它是独立的,而不是像以前一样“ - ”

我需要更改查询才能获得1746 B

此获取(门牌号码):

Florecita Terrace 1746 B floor 3 | **1746**

这需要获得(门牌号码):

Florecita Terrace 1746 B floor 3 | **1746 B**

这是我使用的查询:

declare @address table (address varchar(100))
insert into @address
    select 'Florecita Terrace 1746 B floor 3' union
    select 'Florecita Terrace 1746-B blablabla' union
    select 'Street Flor 4141' 

select  
     address,
     --patindex('%[0-9]%', address) as 'start',
     --charindex(space(1), address + space(1), patindex('%[0-9]%', address)) - (patindex('%[0-9]%', address)) as 'length',
    case 
        when patindex('%[^0-9]%' , address) > 0
                then substring(address, patindex('%[0-9]%', address), charindex(space(1), address + space(1), patindex('%[0-9]%', address)) - 
                                (patindex('%[0-9]%', address)))
        else address
    end as 'numeric'
from @address

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

如果启用CLR并添加为.NET正则表达式过程创建包装器的.NET CLR程序集,那么可以让SQL Server使用功能齐全的正则表达式。您可以在here找到一个不必在Visual Studio中自行构建的好例子。

答案 1 :(得分:0)

declare @address table (address varchar(100))
insert into @address
    select 'Florecita Terrace 1746 B floor 3' union
    select 'Florecita Terrace 1746-B blablabla' union
    select 'Street Flor 4141' 

select  
     address,
     --patindex('%[0-9]%', address) as 'start',
     --charindex(space(1), address + space(1), patindex('%[0-9]%', address)) - (patindex('%[0-9]%', address)) as 'length',
    case 
        when patindex('%[^0-9]%' , address) > 0
                then substring(address, patindex('%[0-9]%', address), charindex(space(1), address + space(1), patindex('%[0-9]%', address)) +(case when address not like ('%-%') then 2 else 1 end) - 
                                (patindex('%[0-9]%', address)))
        else address
    end as 'numeric'
from @address