2017-09-19 9 views
0

私は膨大な顧客データを持っています。私はAddress1列から5桁の郵便番号を取得したいです。TSQL:文字列から固定長の数字だけを抽出する方法

私は以下の乱雑なコードを持っている:上記のコードの場合

SELECT 
    (SELECT LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000), 
     PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1)) 
FROM CustomerList where LEN(LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000), 
     PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1)) = 5 -- Get only records that has exactly 5 value 

を、以下のデータが動作します:

"筋力JTジョーンズ40030。。" - "40030"

を得ることができますしかし、以下のデータは機能しません:

"22 Str。Mel 50630" - 郵便番号ではなく、 "22"番地のみを取得できます。

「65から31 Kampar 47000バウ」 - のみ65

「ロット199 Guasa 30990オマール」を得ることができます - だけだから私のコードは唯一の郵便番号を持っているそれらのレコードを取得することができます199

を得ることができます。 Address1に他の数字が含まれていると、動作しません。

助けてください。

EDIT:

どうやら私の現在のコードは `「左から数字を読み始めている、私は右の代わりにからの読み込みを開始し、現在のコードを変更することができる方法はありますか?あなたはこのようなものを使用しようとすることができますポストの例では

+0

データの郵便番号は、常に住所の最後/最後の部分ですか? – Tyron78

+0

巨大なデータリストを持っている場合は、ポストコードは*別の*フィールドにする必要があります。 * 1つの*ポストコードを検索するたびに1M行を解析するとします。 –

+0

@PanagiotisKanavosデータはクライアントによって提供されているため、フィルタリングして別の列に分割する必要があります。 –

答えて

2

何単にあなたのアドレスの最後の部分を除去についてはどうですか?例:

DECLARE @Address1 NVARCHAR(100) = 'Lot 199 Guasa 30990 Omar'; 
SELECT 
    (SELECT REVERSE(LEFT(SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000), 
    PATINDEX('%[^0-9]%', SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000) + 'X') -1))) AS PostCode 
+0

申し訳ありません。私はちょうど最後の部分にポストコードが正確ではないため、 'RIGHT 'を使った別の2つのサンプルデータを追加しました –

+0

私はクエリを修正しました:逆の文字列でRegexpを使ってもう一度結果を逆転します。 .. – Tyron78

+0

うわーいいです。 'REVERSE'について新しいことを学びましょう。本当にありがとう、本当にありがとう –

0

WITH X AS (SELECT '65-31 Kampar 47000 Bau' AS A UNION ALL SELECT 'Str. Jt. Jones 40030' UNION ALL SELECT 'Lot 199 Guasa 30990 Omar' ) 

SELECT REVERSE(SUBSTRING(REVERSE(A), patindex('%[0-9]%', REVERSE(A)) ,5)) FROM X 

出力:

47000 
40030 
30990 
関連する問題