我正在处理一个CSV地址文件,该文件每天都会上传到FTP站点。地址记录包括address_Line1、address_Line2、城市、州、ZipCode和国家。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时认为有六个地址是相同的,但在创建哈希时却认为不同。
是否存在相同字符串可能导致创建不同哈希的情况?如果是,可以采取什么措施来纠正问题?
在调用HASHBYTES之前,应该规范空白和大小写,因为它总是区分大小写的。默认情况下,正常SQL操作期间的字符串比较不区分大小写(可以使用COLLATION服务器设置进行修改)。
LTRIM(RTRIM(TOLOWER(@value)))