2012-01-13 15 views
1

私は、アドレス、州および郵便番号を含むアドレス列を持っています。私は、住所、郊外、州、および郵便番号を別々の列に抽出したいと思います。アドレスの長さが変わるとどうしたらいいですか?アドレスと "その他"の詳細を区切る^があります。州は2文字または3文字で、郵便番号は常に4文字です。SQL Server 2008 - 分離アドレスフィールド

PostalAddress       TO BE Address Suburb  State Postcode 
28 Smith Avenue^MOOROOLBARK VIC 3138^ 28 Smith Avenue MOOROOLBARK VIC 3138 
16 Farr Street^HEYFIELD VIC 3858^  16 Farr Street HEYFIELD  VIC 3858 
17 Terry Road^LOWER PLENTY VIC 3093^  17 Terry Road LOWER PLENTY VIC 3093 
+0

あなたは1時間タスクまたは任意の、進行中の関数、このです必要? – Sparky

+0

これは現在進行中です。 – HL8

答えて

5

SQLでの文字列解析は面倒で、脆くなる傾向があります。私は通常、SQLの外部でこの種のタスクを行うのが最善だと考えています。あなたはので、私はアドレスと呼ばれてきたもののためにあなたのテーブル名を置き換える必要があります

select 
    left(PostalAddress, charindex('^', PostalAddress) - 1) as street_address, 
    left(second_part, len(second_part) - charindex(' ', reverse(second_part))) as suburb, 
    right(second_part, charindex(' ', reverse(second_part))) as state, 
    reverse(substring(reverse(PostalAddress), 2, 4)) as postal_code 
from (
    select 
    PostalAddress, 
    rtrim(reverse(substring(reverse(PostalAddress), 6, len(PostalAddress) - charindex('^', PostalAddress) - 5))) as second_part 
    from Addresses 
) as t1 

注:それ以上のミニスペック与え、言った、あなたがそうのようにしたいフィールドにデータを解析することが可能です上記のサブクエリで

これは、サンプルデータhereに対して実際に動作しています。

+0

こんにちは、ありがとうございます。しかし、私は次のエラー、メッセージ536、レベル16、状態3、行1を取得しています 無効な長さのパラメーターが部分文字列関数に渡されました。 – HL8

+0

このエラーは、一部のフィールドが他のフィールドと同じ方法でフォーマットされていないことを意味します(キャレットなどがない可能性があります)。 – Sparky

+1

問題を特定するためにSELECT * FROM Addresses WHERE Charindex( '^'、PostalAdress)レコード – Sparky

0

私の場合はそれだけで郵便番号などの文字列から5数値を取得することです。以下は

が私のコードです:

Select SUBSTRING([Column or string],patindex('%[0-9][0-9][0-9][0-9][0-9]%',[Column or string]),5) AS 'Postcode' 
+0

これは質問ですか、それとも答えですか? –

+1

トップには申し訳ありませんが、回答は –

+0

ありがとうございました。私の壊れた英語のために申し訳ありません –