比对不同位数身份证号的SQL问题

今天碰到的问题,人口库,与需要比对库的身份证号码都存在这样的问题:
记录里面有些记录身份证号码15位,有些是18位的。

这给比对带来了麻烦,最好的办法就是更新成为统一的,因为15变18可能是人工填写,容易错,最好都改成15位的。
我不想通过update统一修改库里的数据,这是自己给自己找的麻烦,怎么弄呢。
SQL毕竟不是程序语言,所以不能在where子句里进行——是否15位不是改成15,再判断——这样的法子。最后找了一个折中的办法。

先比对需要对比库的表里15的,再比对它里面的18位的。人口库通过in(select case when)的方式统一改成15 位。

select * from
(

SELECT dbo.[Sheet].
*
FROM dbo.[Sheet]
where
    len(dbo.[Sheet].[身份证号码])
>15 
and 
    (left(dbo.[Sheet].[身份证号码],
6)+substring(dbo.[Sheet].[身份证号码],9,9)) 
in 
(select 
case
    when 
        len([Col007])
>15 
    then 
        (left([Col007],
6)+substring([Col007],9,9))
    
else
        [Col007]
    end 
        
as 身份证号码
    from dbo.[
2009-04-21]
)

union

SELECT dbo.[Sheet].
*
FROM dbo.[Sheet]
where
    len(dbo.[Sheet].[身份证号码])
=15 
and 
    dbo.[Sheet].[身份证号码]
in 
(select 
case
    when 
        len([Col007])
>15 
    then 
        (left([Col007],
6)+substring([Col007],9,9))
    
else
        [Col007]
    end 
        
as 身份证号码
    from dbo.[
2009-04-21]
)
)
as T

效果还行,就是速度不是很快,2W在30W里比对,3秒不知道算不算慢。

原文地址:https://www.cnblogs.com/edzjx/p/1442820.html