在表A中有一个字段(sfzh)用来存放身份证号码,在表B中一个字段用来存放地区代码(dm),一个字段用来存放地区名称(mc).
如445281XXXXXXXXXXXXXX 44表示广东省,而4452表示揭阳市,而445281则表示普宁市
在表B中 只有两个字段也就是代码编号和名称放在一个表中。440000表示广东。
如何让检索回来的字段产生“广东省揭阳市普宁市”这种呢。先谢过各位了。
35 个解决方案
#1
UP一下先,快要沉了.
#2
你是要根据用户的身份证号码来得到用户所在的地址信息吗?
我觉得你可以在表A中直接搞个字段来存储该用户的地址信息啊,为什么还要从身份证号码中读取呢?
我觉得你可以在表A中直接搞个字段来存储该用户的地址信息啊,为什么还要从身份证号码中读取呢?
#3
取前六位,然后到B表中去找.
#4
嗯.是根据身份证的号码来取的.因为得到的表A只有姓名和身份证号的信息,所以只能通过身份证从表B中获取那些地址信息.
用SUBSTRING取前六位到表B中找,得不到省的名称和市的名称.
用SUBSTRING取前六位到表B中找,得不到省的名称和市的名称.
#5
你的表B的结构设计的不对啊,你用440000表示广东,这说明你是想把全国所有的省、地区和县等信息全部存储在一个表中,如果是这样的话,你是很难根据身份证号码前六位来得到所在地区信息的,是不是应该分成三个表了:省级信息表、地区信息表和县级信息表
#6
嘿嘿,难就难在这里。数据是从网上下载的。国家标准数据来的。
表A 只有姓名,身份证号码 表B 只有代码,名称。包括全国所有的省、市、地区、县名称和代码信息都在一个表中。
要综合两个表,从身份证号码中提取省名+市名+县名
表A 只有姓名,身份证号码 表B 只有代码,名称。包括全国所有的省、市、地区、县名称和代码信息都在一个表中。
要综合两个表,从身份证号码中提取省名+市名+县名
#7
同意楼上,表结构有问题,应该用双编号法实现数据存储(尤其是表B)
ID NAME PID
44 广东省 0
52 揭阳市 44
81 普宁市 52
.
.
等,这里就不再详述!
查询时用UDL来实现就可以了!
ID NAME PID
44 广东省 0
52 揭阳市 44
81 普宁市 52
.
.
等,这里就不再详述!
查询时用UDL来实现就可以了!
#8
重新建立表很麻烦,要拆分数据。看来只能在程序中进行多次检索在组合返回值了。
SQL中就没有其它办法了吗?
表A
姓名 身份证号
AAA 445281XXXXXXXXXXXXXX
表B
代码 名称
440000 广东省
445200 揭阳市
445281 普宁市
通过SQL语句返回如下信息:
姓名 身份证号 出生地
AAA 445281XXXXXXXXXXXXXX 广东省揭阳市普宁市
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
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
(
姓名 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(新来的) 的办法可以。
给分,结贴,走人。
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 姓名,身份证号
(
姓名 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
这样,不就把省,市,地名称全部取到了吗??
假设表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
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
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中直接搞个字段来存储该用户的地址信息啊,为什么还要从身份证号码中读取呢?
我觉得你可以在表A中直接搞个字段来存储该用户的地址信息啊,为什么还要从身份证号码中读取呢?
#3
取前六位,然后到B表中去找.
#4
嗯.是根据身份证的号码来取的.因为得到的表A只有姓名和身份证号的信息,所以只能通过身份证从表B中获取那些地址信息.
用SUBSTRING取前六位到表B中找,得不到省的名称和市的名称.
用SUBSTRING取前六位到表B中找,得不到省的名称和市的名称.
#5
你的表B的结构设计的不对啊,你用440000表示广东,这说明你是想把全国所有的省、地区和县等信息全部存储在一个表中,如果是这样的话,你是很难根据身份证号码前六位来得到所在地区信息的,是不是应该分成三个表了:省级信息表、地区信息表和县级信息表
#6
嘿嘿,难就难在这里。数据是从网上下载的。国家标准数据来的。
表A 只有姓名,身份证号码 表B 只有代码,名称。包括全国所有的省、市、地区、县名称和代码信息都在一个表中。
要综合两个表,从身份证号码中提取省名+市名+县名
表A 只有姓名,身份证号码 表B 只有代码,名称。包括全国所有的省、市、地区、县名称和代码信息都在一个表中。
要综合两个表,从身份证号码中提取省名+市名+县名
#7
同意楼上,表结构有问题,应该用双编号法实现数据存储(尤其是表B)
ID NAME PID
44 广东省 0
52 揭阳市 44
81 普宁市 52
.
.
等,这里就不再详述!
查询时用UDL来实现就可以了!
ID NAME PID
44 广东省 0
52 揭阳市 44
81 普宁市 52
.
.
等,这里就不再详述!
查询时用UDL来实现就可以了!
#8
重新建立表很麻烦,要拆分数据。看来只能在程序中进行多次检索在组合返回值了。
SQL中就没有其它办法了吗?
表A
姓名 身份证号
AAA 445281XXXXXXXXXXXXXX
表B
代码 名称
440000 广东省
445200 揭阳市
445281 普宁市
通过SQL语句返回如下信息:
姓名 身份证号 出生地
AAA 445281XXXXXXXXXXXXXX 广东省揭阳市普宁市
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
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
(
姓名 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(新来的) 的办法可以。
给分,结贴,走人。
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 姓名,身份证号
(
姓名 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
这样,不就把省,市,地名称全部取到了吗??
假设表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
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
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
世界太罗嗦,不分多或错,像我这样的老百姓谁能在乎我,有钱当老大,没钱难过活,就算是没把握我又能如何。