1

FTP サイトに毎日アップロードされるアドレスの CSV ファイルを使用しています。住所レコードは、Address_Line1、Address_Line2、City、State、Zip_Code、および Country で構成されます。CSV に重複するアドレスが複数あります。私の仕事は、CSV ファイル内のすべての住所を既存の住所次元と比較し、新しい住所のみをロードすることです。これを行うには、まず CSV からステージング テーブルに読み込み、次に次のクエリを実行してハッシュを生成し、比較を行います。

UPDATE STG_ADDRESS
SET ADDRESS_HASH = HASHBYTES(
    'SHA1'
    ,ISNULL(ADDRESS_LINE1, 'N/A') + 
    ISNULL(ADDRESS_LINE2, 'N/A') +
    ISNULL(CITY, 'N/A') +
    ISNULL(STATE, 'N/A') +
    ISNULL(ZIP_CODE, 'N/A') + 
    ISNULL(COUNTRY, 'N/A'));

これは、1 つの例外を除いて正常に機能しています。HASHBYTES 関数は、まったく同じアドレスに対して複数のハッシュを生成しています。今日のアップロードでは、次のクエリを実行し、37 個の個別のアドレスを取得しました。

SELECT DISTINCT 
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')

FROM STG_ADDRESS

ハッシュで更新した後、次のクエリを実行し、43 レコードを取得しました。

SELECT DISTINCT 
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')
    ,ADDRESS_HASH

FROM STG_ADDRESS

次のクエリでこれを再確認しました。

SELECT DISTINCT 
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')
    ,COUNT(ADDRESS_HASH)

FROM STG_ADDRESS

GROUP BY
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')

HAVING COUNT(ADDRESS_HASH) > 1

また、SQL サーバーが SELECT DISTINCT の実行時に同じと見なす 6 つのアドレスがあることを確認しましたが、ハッシュの作成時に何らかの形で異なると見なします。

同じ文字列で別のハッシュが作成されるシナリオはありますか? もしそうなら、問題を修正するために何ができますか?

4

1 に答える 1

3

常に大文字と小文字が区別されるため、HASHBYTES を呼び出す前に空白と大文字と小文字を正規化する必要があります。デフォルトでは、通常の SQL 操作中の文字列比較では大文字と小文字が区別されません (これは COLLATION サーバー設定で変更できます)。

LTRIM(RTRIM(TOLOWER(@value)))
于 2015-03-20T16:05:57.740 に答える