0

毎晩 SQL テーブルにインポートするデータ セットがあります。1 つのフィールドは「Address_3」で、City、State、Zip、および Country フィールドが含まれています。ただし、このデータは標準化されていません。現在1つのフィールドに入っているデータを個々のフィールドに解析するにはどうすればよいですか? 受け取るデータの例を次に示します。

'INDIANAPOLIS, IN 46268  US'
'INDIANAPOLIS, IN 46268-1234  US'
'INDIANAPOLIS, IN 46268-1234'
'INDIANAPOLIS, IN 46268'

前もって感謝します!デビッド

4

4 に答える 4

2

私は似たようなことをしました (T-SQL ではありません) が、文字列の最後から開始して逆方向に作業するのが最も効果的であることがわかりました。

  • 右端の要素から最初のスペースまたはカンマまでを取得します。
  • それは既知の国コードですか?それは国です
  • そうでない場合、すべて数字 (ハイフンを含む) ですか? 郵便番号です。
  • それ以外の場合は破棄します

右端から 2 番目の要素を次のスペースまたはコンマまで取得します

  • 英字2文字のフィールドですか?それは州です

最後のコンマの前にある他のすべてを取得し、それを都市と呼びます。

入力データがどのように見えるかに基づいて調整を行う必要がありますが、基本的な考え方は、右から始めて、簡単に分類できる要素を取得し、それ以外はすべて都市と呼ぶことです。

REVERSE関数を使用して検索を容易にすることで、このようなものを実装できます(この場合、上記のように右から左ではなく左から右に文字列を解析します)、PATINDEXまたはCHARINDEX関数を使用してスペースを検索し、コンマ、およびPATINDEX と CHARINDEX によって検出された位置に基づいてアドレスを分離するSUBSTRING関数。ASCII関数を使用して、文字が数値かどうかを判断できます。

質問にも SSIS タグを付けました。T-SQL を使用するよりも、SSIS の一部の VB スクリプトで解析を実装する方が簡単な場合があります。

于 2010-04-30T20:13:05.413 に答える
1

最善の方法は、一からやり直すのではなく、アドレスの解析と標準化のエンジンを手に入れることです。理想的には、郵便局によって承認された CASS 認定エンジンを使用することをお勧めします。しかし、最近ではネット上に無料のアドレス パーサーがあり、それらのいずれかを使用すると、自分でアドレスを解析しようとするよりも正確でストレスが少なくなります。

とはいえ、住所パーサーと郵便局は下から上に向かって機能すると言えます (つまり、国、郵便番号、都市、州、住所 2 行目など)。

于 2010-05-02T03:22:13.387 に答える
0

このようなものが役立つはずです:

select substring(CityStateZip, 1, 
case when charindex(',',reverse(CityStateZip)) = 0 then len(CityStateZip) 
else len(CityStateZip) - charindex(',',reverse(CityStateZip)) end) as City,
LEFT(LTRIM(
SUBSTRING(CityStateZip, case when charindex(',',reverse(CityStateZip)) = 0 then len(CityStateZip) else 
len(CityStateZip) - charindex(',',reverse(CityStateZip))+2 end, LEN(CityStateZip)))
,2) as State,

SUBSTRING(CityStateZip, case when charindex(' ',reverse(CityStateZip)) = 0 then len(CityStateZip) else 
len(CityStateZip) - charindex(' ',reverse(CityStateZip))+2 end, LEN(CityStateZip)) as Zip

from   YourAddressTable
于 2014-05-08T22:35:00.507 に答える
0

SSIS では、4 つの派生列 (都市、州、郵便番号、国) を使用できます。

substring(column,1,FINDSTRING(",",column,1)-1)  --city
substring(column,FINDSTRING(" ",column,1)+1,FINDSTRING("",column,2)-1) --state
substring(column,FINDSTRING(" ",column,2)+1,FINDSTRING(" ",column,3)-1) -- zip

上記のパターンを見て、それに応じて続行できます。これは少し複雑になるかもしれません。スクリプト コンポーネントを使用して、テキスト行をより適切に引き出すことができます。

于 2010-05-01T15:14:51.037 に答える