2017-07-19 117 views
0

我有一个查询,我从某些地址解析单元#。SQL地址解析

CASE WHEN Address1 LIKE '%apt %' THEN SUBSTRING(Address1, CHARINDEX('Apt', Address1), LEN(Address1)) 

这样的工作原理应该是当地址设置为:“123 Main St. Apt。1A”。

我将得到“Apt。1A”作为我的结果。

但是,有些情况下我的数据设置不同,例如“Apt.2B 123 Fake Street”。当数据被设置这样我得到“公寓。2B 123假一条街”

我要找的是结果“公寓。2B”

如何让我的查询来获得“公寓。 “。文本和下列所有文本直至下一个空间?

+8

在TSQL中解析地址似乎不是一个好主意。 –

回答

2

有很多事情可能会导致这个错误...这个代码可能不适用于所有情况,这取决于您的地址格式。假设格式是Apt然后空间AptNumberLetter然后一个空间...这可能工作。我把它分解出来以显示它的功能。正如马丁所说,再次规范日期是你需要做的。

declare @table table (addy varchar(450)) 
insert into @table 
values 
('Apt. 2B 123 Fake Street'), 
('123 Main St. Apt. 1A') 

select 
    addy 
    ,CHARINDEX('Apt',addy)startLocation 
    ,CHARINDEX(' ',addy,CHARINDEX('Apt',addy)) firstSpace 
    ,CHARINDEX(' ',addy,CHARINDEX(' ',addy,CHARINDEX('Apt',addy)) + 1) endSpace 
    ,substring(addy,CHARINDEX('Apt',addy),case when CHARINDEX(' ',addy,CHARINDEX(' ',addy,CHARINDEX('Apt',addy)) + 1) = 0 then 99 else CHARINDEX(' ',addy,CHARINDEX(' ',addy,CHARINDEX('Apt',addy)) + 1) end) FinalResult 
from @table 
2

如果您对UDF开放。

分解和提取字符串的分层(charindex,左,右,...),我修改了一个分析/分割udf来接受两个不相似的参数。

现在,解析地址可能是一个滑坡。见我的答案在这里Address standardization within a database

Declare @YourTable table (Address1 varchar(450)) 
Insert into @YourTable values 
('Apt. 2B 123 Fake Street') 
,('123 Main St. Apt. 1A') 
,('100 North Main St.') 

Select A.Address1 
     ,Apt = 'Apt. '+B.RetVal 
From @YourTable A 
Outer Apply [dbo].[udf-Str-Extract](' '+A.Address1+' ',' Apt. ',' ') B 

返回

Address1      Apt 
Apt. 2B 123 Fake Street  Apt. 2B 
123 Main St. Apt. 1A   Apt. 1A 
100 North Main St.   NULL 

的UDF如果有兴趣

CREATE FUNCTION [dbo].[udf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100)) 
Returns Table 
As 
Return ( 

with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A), 
     cte3(N) As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1), 
     cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S) 

Select RetSeq = Row_Number() over (Order By N) 
     ,RetPos = N 
     ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
From (
     Select *,RetVal = Substring(@String, N, L) 
     From cte4 
     ) A 
Where charindex(@Delimiter2,RetVal)>1 

) 
/* 
Max Length of String 1MM characters 

Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...' 
Select * From [dbo].[udf-Str-Extract] (@String,'[[',']]') 
*/ 
+1

这个地方有代码高尔夫版本吗? (提醒我在SQL编码事件中永远不要对你不利) – xQbert

+0

@xQbert我会在任何一天与你合作。只是一个懒惰的编码器。我宁愿编写一个函数并在很多时候使用。 –

+0

我打算在以后保存这个 – scsimon