今天碰到的问题,人口库,与需要比对库的身份证号码都存在这样的问题:
记录里面有些记录身份证号码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
(
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秒不知道算不算慢。