我正在处理每天上传到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'));
这是正常的,有一个例外。 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
使用Hash更新后,我运行了以下查询并获得了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 Server在运行SELECT DISTINCT时认为有六个地址相同,但在创建哈希时会以某种方式考虑不同。
是否存在相同字符串可能导致创建不同哈希的任何情况?如果是这样,可以采取哪些措施来纠正这个问题?
答案 0 :(得分:3)
在调用HASHBYTES之前,应该对空格和大小写进行规范化,因为它始终区分大小写。默认情况下,正常SQL操作期间的字符串比较不区分大小写(您可以使用COLLATION服务器设置对其进行修改)。
LTRIM(RTRIM(TOLOWER(@value)))