2017-07-19 2 views
0

J'ai une requête où j'analyse l'unité # à partir de certaines adresses.Analyse d'adresse SQL

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

Cela fonctionne comme il devrait quand l'adresse est définie comme: «123 Grand-rue Apt 1A ».

Je vais obtenir "Apt 1A" comme résultat.

Cependant, dans certains cas, mes données sont configurées différemment, par exemple "Apt 2B 123 Fake Street". Lorsque les données sont mis en place comme cela, je reçois « Apt. 2B 123, rue Faux »

Le résultat que je suis à la recherche est « Apt. 2B »

Comment puis-je obtenir ma requête pour obtenir le « Apt " texte et tout le texte suivant jusqu'à l'espace suivant?

+8

L'analyse des adresses dans TSQL ne semble pas être une bonne idée. –

Répondre

2

Il y a une tonne de choses qui pourraient faire mal ... et ce code ne fonctionnera probablement pas dans tous les cas selon le format de votre adresse. En supposant que le format est Apt alors un espace AptNumberLetter alors un espace ... cela pourrait fonctionner. Je l'ai cassé pour montrer ce qu'il fait. Encore une fois, la normalisation des dates est ce que vous devez faire comme Martin a déclaré.

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

Si vous êtes ouvert à un fichier UDF.

En hiérarchie d'analyse et d'extraction de chaînes (charindex, left, right, ...), j'ai modifié une analyse/split udf pour accepter deux paramètres non similaires. Maintenant, l'analyse des adresses peut être une pente glissante. Voir ma réponse ici Address standardization within a database

Exemple

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 

Retours

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

L'UDF si vous êtes intéressé

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

Y at-il une version de golf de code de ce quelque part? (Rappelez-moi de ne jamais aller contre vous dans un événement de programmation SQL) – xQbert

+0

@xQbert Je serais partenaire avec vous un jour. Juste un codeur paresseux. Je préfère écrire une fonction et l'utiliser à plusieurs reprises. –

+0

je vais enregistrer cela pour plus tard – scsimon