2016-05-16 5 views
2

にスペースやカンマでアドレスのSQL解析文字列私はデータのリストを持っている:別々のフィールド

ADDRESS 
    '204 W 8th St, ABC, New York, NY 12345-6789' 
    '222 N Barley St, Pittsburh, Pennsylvania, PA 98765-4321' 
    '1 S Main St, Good Day, Washington, PA 13579-2468' 
    '232 Justin Blvd, Sacramento, CA 86420-7531' 
私は5つのフィールドすなわちメールアドレス1、メールアドレス2、市、州に解析したい

、 郵便番号。私は、これらの個々の一部を解析することができたものの、正しくないないよう:主に私のメールアドレス2を取得します

select distinct StreetName = 
    substring(ADDRESS, CHARINDEX(',', ADDRESS+',', 1) +1, 
    CHARINDEX(',', ADDRESS+',', CHARINDEX(',', ADDRESS+',', 1) +1) - 
    CHARINDEX(',', ADDRESS+',', 1) -1) 
    from Bills 
    where ISNUMERIC(LEFT(ADDRESS,1))=1 
    AND LEN(ADDRESS) > 1 

。文字列を5列に分割するには、どうすればよいですか?

+0

文字列を5つの別々の列に分割しますか? – Stivan

+0

はい、まさに私がしたいことです。 – user106279

+0

'parsename()'と 'replace()'関数を使用できますか? – Stivan

答えて

1

パーズアドレスはやや難しい作業かもしれません。本当にすべてのルールはわかりません。ここでは、他のプログラミング言語と同様に、SQLで計算を段階的に行う方法を説明します。 CROSS/OUTER APPLYを使用してください。

select sd.addr, t.*, tt.*, ttt.* 
from (
    select '204 W 8th St, ABC, New York, NY 12345-6789' as addr 
) sd 
cross apply(
    select nParts = len(addr) - len(replace(addr,',','')) 
    , lastPos = len(addr) - charindex(',', reverse(addr),1) +1 
    , secondPos = charindex(',' ,addr,1) 
    ) t 
cross apply(
    select first = left(addr, secondPos-1) 
    ,middle = substring(addr, secondPos+1, lastPos - secondPos -1) 
    ,last = right(addr, len(addr) - lastPos) 
    ) tt 
outer apply( 
    select thirdPos = charindex(',' , middle ,1) 
    ,forthPos = len(middle) - charindex(',', reverse(middle),1)+1 
    where nParts >3  
    ) ttt 

などとなる。必要に応じてステップとロジックを追加します。

関連する問題