SQL Server 2014:HASHYTES为同一字符串返回不同的值



我正在处理一个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)))

相关内容

  • 没有找到相关文章

最新更新