关于在身份证号码中提取信息的问题,请各位网友指点。

时间:2020-12-21 20:43:06
在身份证号码中其中的第一、第二数字表示公民所在地的省份(或自治区、直辖市);第三、第四位数字表示公民所在地的市(或州);第五、第六位数字表示公民所在地的县(或县级市);
在表A中有一个字段(sfzh)用来存放身份证号码,在表B中一个字段用来存放地区代码(dm),一个字段用来存放地区名称(mc).
如445281XXXXXXXXXXXXXX 44表示广东省,而4452表示揭阳市,而445281则表示普宁市
在表B中 只有两个字段也就是代码编号和名称放在一个表中。440000表示广东。
如何让检索回来的字段产生“广东省揭阳市普宁市”这种呢。先谢过各位了。

35 个解决方案

#1


UP一下先,快要沉了.

#2


你是要根据用户的身份证号码来得到用户所在的地址信息吗?
我觉得你可以在表A中直接搞个字段来存储该用户的地址信息啊,为什么还要从身份证号码中读取呢?

#3


取前六位,然后到B表中去找.

#4


嗯.是根据身份证的号码来取的.因为得到的表A只有姓名和身份证号的信息,所以只能通过身份证从表B中获取那些地址信息.

用SUBSTRING取前六位到表B中找,得不到省的名称和市的名称.

#5


你的表B的结构设计的不对啊,你用440000表示广东,这说明你是想把全国所有的省、地区和县等信息全部存储在一个表中,如果是这样的话,你是很难根据身份证号码前六位来得到所在地区信息的,是不是应该分成三个表了:省级信息表、地区信息表和县级信息表

#6


嘿嘿,难就难在这里。数据是从网上下载的。国家标准数据来的。
表A 只有姓名,身份证号码  表B 只有代码,名称。包括全国所有的省、市、地区、县名称和代码信息都在一个表中。
要综合两个表,从身份证号码中提取省名+市名+县名

#7


同意楼上,表结构有问题,应该用双编号法实现数据存储(尤其是表B)
ID    NAME     PID
44   广东省    0
52   揭阳市   44
81   普宁市   52
.
.

等,这里就不再详述!
查询时用UDL来实现就可以了!

#8


重新建立表很麻烦,要拆分数据。看来只能在程序中进行多次检索在组合返回值了。

SQL中就没有其它办法了吗?

表A 
姓名     身份证号
AAA   445281XXXXXXXXXXXXXX

表B
代码     名称
440000  广东省
445200  揭阳市 
445281  普宁市

通过SQL语句返回如下信息:
姓名      身份证号                  出生地
AAA      445281XXXXXXXXXXXXXX       广东省揭阳市普宁市

#9


up

#10


UP一下.要沉了..........

#11


用函数或存储过程应该也可以实现的,先取前两位加四个零去检索B表,再取前四位加两个零去检索B表,再取六位检索B表,得到的结果合在一起不就行了。

#12


我也是这么想的,但是不知道那个过程应该怎么来写,还请多多指教。

#13


declare @t varchar(100)
select @t=名称 from B where 代码=(select substring(身份证号,1,2)+'0000' from A where 姓名='AAA')
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,4)+'00' from A where 姓名='AAA')
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,6) from A where 姓名='AAA')
print @t

#14


create table A
(
姓名 varchar(10),
身份证号 varchar(18)
)
insert A
select 'AAA','445281XXXXXXXXXXXX'
create table B
(
代码 varchar(20),
名称 varchar(20)
)
insert B
select '440000','广东省' union all
select '445200','揭阳市' union all 
select '445281','普宁市'
select * from A
select * from B

go

create proc test
(
@name varchar(10),
@address varchar(100) output
)
as
begin
declare @t varchar(100)
set @name='AAA'
select @t=名称 from B where 代码=(select substring(身份证号,1,2)+'0000' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,4)+'00' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,6) from A where 姓名=@name)
--print @t
set @address=@t
end
go
declare @add varchar(100)
exec test 'AAA',@add output
print @add

#15


先谢谢指点。请问后面可以不设置条件吗?批量处理所有的数据。

#16



select b1.名称+b2.名称+b3.名称 from B b1,B b2,B b3
    where b1.代码=(select substring(身份证号,1,2)+'0000' from A where 姓名='AAA')
and b2.代码=(select substring(身份证号,1,4)+'00' from A where 姓名='AAA')
and b3.代码=(select substring(身份证号,1,6) from A where 姓名='AAA')

#17



select A.姓名,A.身份证号,b1.名称+b2.名称+b3.名称 from A,B b1,B b2,B b3
    where b1.代码=substring(身份证号,1,2)+'0000'
and b2.代码=substring(身份证号,1,4)+'00'
and b3.代码=substring(身份证号,1,6)

#18


那写个函数试试

#19


谢谢各位!!!!!谢谢各位的帮助。
ww3347(新来的) 的办法可以。

给分,结贴,走人。

#20



select A.姓名,A.身份证号,
地址=isnull((select 名称 from B where 代码=substring(A.身份证号,1,2)+'0000'),'')
  +isnull((select 名称 from B where 代码=substring(A.身份证号,1,4)+'00'),'')
  +isnull((select 名称 from B where 代码=substring(A.身份证号,1,6)),'')
from A

这样,更安全一点。

#21


分不多了,还望各位见谅!

#22


create table A
(
姓名 varchar(10),
身份证号 varchar(18)
)
insert A
select 'AAA','445281XXXXXXXXXXXX' union all
select 'BBB','430181xxxxxxxxxxxx' union all
select 'CCC','430181xxxxxxxxxxxx'
create table B
(
代码 varchar(20),
名称 varchar(20)
)
insert B
select '440000','广东省' union all
select '445200','揭阳市' union all 
select '445281','普宁市' union all
select '430000','湖南省' union all
select '430100','长沙市' union all
select '430181','浏阳市'
select * from A
select * from B
go
create function test
(
@name varchar(10)
)
returns varchar(100)
as
begin
declare @t varchar(100)
select @t=名称 from B where 代码=(select substring(身份证号,1,2)+'0000' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,4)+'00' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,6) from A where 姓名=@name)
--print @t
return @t
end
go
select a.*,dbo.test(姓名) from A,B group by 姓名,身份证号

#23


#24


用这么麻烦吗,一条SQL可以搞定啊
假设表A(TableA)结构为 身份证号码(ID),姓名(name)
表B(TableB)结构为 地区码(code),地区名称(desc)
如此写SQL即可
select a.id,a.name,b.desc as 省名称,c.desc as 市名称,d.desc as 地名称
from tableA a join tableB b on substring(a.id,1,2)=b.code
join tableB c on substring(a.id,3,2)=b.code
join tableB c on substring(a.id,5,2)=b.code

这样,不就把省,市,地名称全部取到了吗??

#25



来晚了

#26


niat97222的方法是会更好些.不过join的条件写错了.

from tableA a join tableB b 
on substring(a.id,1,2)=substring(b.code,1,2) and substring(b.code,3,4)='0000'

join tableB c 
on substring(a.id,3,2)=substring(b.code,1,4) and substring(b.code,4,2)='00'

join tableB c on substring(a.id,1,6)=b.code

#27


修正:
from tableA a join tableB b 
on substring(a.id,1,2)=substring(b.code,1,2) and substring(b.code,3,4)='0000'

join tableB c 
on substring(a.id,3,2)=substring(b.code,1,4) and substring(b.code,5,2)='00'

join tableB c on substring(a.id,1,6)=b.code

#28


晕死,我这里正好有一个全国行政区的编码是国标的,只要你输入445281就能出广东省揭阳市普宁市

#29


ukp

#30


谢谢上面几位.

#31


调试没有通过,不知各位有没有试过.

#32


唉,来晚了,前两天正好解决了一个这样的问题,还有现成的语句在,唉!

#33


不错

#34


呵呵.楼上的贴上来呀.

#35


世界太罗嗦,不分多或错,像我这样的老百姓谁能在乎我,有钱当老大,没钱难过活,就算是没把握我又能如何。

#1


UP一下先,快要沉了.

#2


你是要根据用户的身份证号码来得到用户所在的地址信息吗?
我觉得你可以在表A中直接搞个字段来存储该用户的地址信息啊,为什么还要从身份证号码中读取呢?

#3


取前六位,然后到B表中去找.

#4


嗯.是根据身份证的号码来取的.因为得到的表A只有姓名和身份证号的信息,所以只能通过身份证从表B中获取那些地址信息.

用SUBSTRING取前六位到表B中找,得不到省的名称和市的名称.

#5


你的表B的结构设计的不对啊,你用440000表示广东,这说明你是想把全国所有的省、地区和县等信息全部存储在一个表中,如果是这样的话,你是很难根据身份证号码前六位来得到所在地区信息的,是不是应该分成三个表了:省级信息表、地区信息表和县级信息表

#6


嘿嘿,难就难在这里。数据是从网上下载的。国家标准数据来的。
表A 只有姓名,身份证号码  表B 只有代码,名称。包括全国所有的省、市、地区、县名称和代码信息都在一个表中。
要综合两个表,从身份证号码中提取省名+市名+县名

#7


同意楼上,表结构有问题,应该用双编号法实现数据存储(尤其是表B)
ID    NAME     PID
44   广东省    0
52   揭阳市   44
81   普宁市   52
.
.

等,这里就不再详述!
查询时用UDL来实现就可以了!

#8


重新建立表很麻烦,要拆分数据。看来只能在程序中进行多次检索在组合返回值了。

SQL中就没有其它办法了吗?

表A 
姓名     身份证号
AAA   445281XXXXXXXXXXXXXX

表B
代码     名称
440000  广东省
445200  揭阳市 
445281  普宁市

通过SQL语句返回如下信息:
姓名      身份证号                  出生地
AAA      445281XXXXXXXXXXXXXX       广东省揭阳市普宁市

#9


up

#10


UP一下.要沉了..........

#11


用函数或存储过程应该也可以实现的,先取前两位加四个零去检索B表,再取前四位加两个零去检索B表,再取六位检索B表,得到的结果合在一起不就行了。

#12


我也是这么想的,但是不知道那个过程应该怎么来写,还请多多指教。

#13


declare @t varchar(100)
select @t=名称 from B where 代码=(select substring(身份证号,1,2)+'0000' from A where 姓名='AAA')
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,4)+'00' from A where 姓名='AAA')
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,6) from A where 姓名='AAA')
print @t

#14


create table A
(
姓名 varchar(10),
身份证号 varchar(18)
)
insert A
select 'AAA','445281XXXXXXXXXXXX'
create table B
(
代码 varchar(20),
名称 varchar(20)
)
insert B
select '440000','广东省' union all
select '445200','揭阳市' union all 
select '445281','普宁市'
select * from A
select * from B

go

create proc test
(
@name varchar(10),
@address varchar(100) output
)
as
begin
declare @t varchar(100)
set @name='AAA'
select @t=名称 from B where 代码=(select substring(身份证号,1,2)+'0000' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,4)+'00' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,6) from A where 姓名=@name)
--print @t
set @address=@t
end
go
declare @add varchar(100)
exec test 'AAA',@add output
print @add

#15


先谢谢指点。请问后面可以不设置条件吗?批量处理所有的数据。

#16



select b1.名称+b2.名称+b3.名称 from B b1,B b2,B b3
    where b1.代码=(select substring(身份证号,1,2)+'0000' from A where 姓名='AAA')
and b2.代码=(select substring(身份证号,1,4)+'00' from A where 姓名='AAA')
and b3.代码=(select substring(身份证号,1,6) from A where 姓名='AAA')

#17



select A.姓名,A.身份证号,b1.名称+b2.名称+b3.名称 from A,B b1,B b2,B b3
    where b1.代码=substring(身份证号,1,2)+'0000'
and b2.代码=substring(身份证号,1,4)+'00'
and b3.代码=substring(身份证号,1,6)

#18


那写个函数试试

#19


谢谢各位!!!!!谢谢各位的帮助。
ww3347(新来的) 的办法可以。

给分,结贴,走人。

#20



select A.姓名,A.身份证号,
地址=isnull((select 名称 from B where 代码=substring(A.身份证号,1,2)+'0000'),'')
  +isnull((select 名称 from B where 代码=substring(A.身份证号,1,4)+'00'),'')
  +isnull((select 名称 from B where 代码=substring(A.身份证号,1,6)),'')
from A

这样,更安全一点。

#21


分不多了,还望各位见谅!

#22


create table A
(
姓名 varchar(10),
身份证号 varchar(18)
)
insert A
select 'AAA','445281XXXXXXXXXXXX' union all
select 'BBB','430181xxxxxxxxxxxx' union all
select 'CCC','430181xxxxxxxxxxxx'
create table B
(
代码 varchar(20),
名称 varchar(20)
)
insert B
select '440000','广东省' union all
select '445200','揭阳市' union all 
select '445281','普宁市' union all
select '430000','湖南省' union all
select '430100','长沙市' union all
select '430181','浏阳市'
select * from A
select * from B
go
create function test
(
@name varchar(10)
)
returns varchar(100)
as
begin
declare @t varchar(100)
select @t=名称 from B where 代码=(select substring(身份证号,1,2)+'0000' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,4)+'00' from A where 姓名=@name)
select @t=@t+名称 from B where 代码=(select substring(身份证号,1,6) from A where 姓名=@name)
--print @t
return @t
end
go
select a.*,dbo.test(姓名) from A,B group by 姓名,身份证号

#23


#24


用这么麻烦吗,一条SQL可以搞定啊
假设表A(TableA)结构为 身份证号码(ID),姓名(name)
表B(TableB)结构为 地区码(code),地区名称(desc)
如此写SQL即可
select a.id,a.name,b.desc as 省名称,c.desc as 市名称,d.desc as 地名称
from tableA a join tableB b on substring(a.id,1,2)=b.code
join tableB c on substring(a.id,3,2)=b.code
join tableB c on substring(a.id,5,2)=b.code

这样,不就把省,市,地名称全部取到了吗??

#25



来晚了

#26


niat97222的方法是会更好些.不过join的条件写错了.

from tableA a join tableB b 
on substring(a.id,1,2)=substring(b.code,1,2) and substring(b.code,3,4)='0000'

join tableB c 
on substring(a.id,3,2)=substring(b.code,1,4) and substring(b.code,4,2)='00'

join tableB c on substring(a.id,1,6)=b.code

#27


修正:
from tableA a join tableB b 
on substring(a.id,1,2)=substring(b.code,1,2) and substring(b.code,3,4)='0000'

join tableB c 
on substring(a.id,3,2)=substring(b.code,1,4) and substring(b.code,5,2)='00'

join tableB c on substring(a.id,1,6)=b.code

#28


晕死,我这里正好有一个全国行政区的编码是国标的,只要你输入445281就能出广东省揭阳市普宁市

#29


ukp

#30


谢谢上面几位.

#31


调试没有通过,不知各位有没有试过.

#32


唉,来晚了,前两天正好解决了一个这样的问题,还有现成的语句在,唉!

#33


不错

#34


呵呵.楼上的贴上来呀.

#35


世界太罗嗦,不分多或错,像我这样的老百姓谁能在乎我,有钱当老大,没钱难过活,就算是没把握我又能如何。