2017-07-19 141 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