地址匹配问题,请大家帮忙指导

huangyj 2011-01-21 04:47:08
表A
ID Address ZipCode
1 北京东路101号
2 北京东路201号
3 北京东路100号
4 北京东路202号

表B
Address iBegin iEnd Zipcode 备注
北京东路 100 200 200100 双号
北京东路 202 400 200200 双号
北京东路 101 199 200300 单号
北京东路 201 399 200400 单号

现在需要根据表B的地址、门牌岂止范围所对应的邮政编码,更新表A中对应的邮政编码列的信息。

谢谢
...全文
149 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2011-01-21
  • 打赏
  • 举报
回复
7楼一种啊还可以用正则啊。顶起
gw6328 2011-01-21
  • 打赏
  • 举报
回复

借用楼上的表,
update a set ZipCode= b.Zipcode
from a join B on cast(reverse(substring(reverse(a.Address),2,3)) as int) between b.iBegin and iEnd and (cast(reverse(substring(reverse(a.Address),2,3)) as int)%2=0 and b.备注='双号')
or (cast(reverse(substring(reverse(a.Address),2,3)) as int)%2=1 and b.备注='单号')
-- 这个只能匹配3位的门牌。要多位,回家再想想看。现在忙。

dawugui 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 huangyj 的回复:]
表A
ID Address ZipCode
1 北京东路13号
2 北京东路201号
3 北京东路8号
4 北京东路202号

表B
Address iBegin iEnd Zipcode 备注
北京东路 2 200 200100 双号
北京东路 202 400 200200 双号
北京东路 5 199 200300 单号
北京东路 201 399 200400 单……
[/Quote]参考7楼第一种方法.
AcHerat 2011-01-21
  • 打赏
  • 举报
回复

update a
set zipcode = (select zipcode
from b
where substring(a.address,5,3) between ibegin and iend
and [备注] = (case when substring(a.address,5,3)%2 > 0 then '单号' else '双号' end))
select * from a

ID Address ZipCode
----------- -------------------- -------
1 北京东路101号 200300
2 北京东路201号 200400
3 北京东路100号 200100
4 北京东路202号 200200

(4 行受影响)
AcHerat 2011-01-21
  • 打赏
  • 举报
回复
9# 里的select 后去掉 top 1 结果也是一样的。
huangyj 2011-01-21
  • 打赏
  • 举报
回复
表A
ID Address ZipCode
1 北京东路13号
2 北京东路201号
3 北京东路8号
4 北京东路202号

表B
Address iBegin iEnd Zipcode 备注
北京东路 2 200 200100 双号
北京东路 202 400 200200 双号
北京东路 5 199 200300 单号
北京东路 201 399 200400 单号
AcHerat 2011-01-21
  • 打赏
  • 举报
回复

create table a(ID int,Address varchar(20),ZipCode varchar(6))
insert into a values(1 ,'北京东路101号','')
insert into a values(2 ,'北京东路201号','')
insert into a values(3 ,'北京东路100号','')
insert into a values(4 ,'北京东路202号','')
go
create table B(Address varchar(10),iBegin int,iEnd int,Zipcode varchar(10),备注 varchar(10))
insert into b values('北京东路', 100 ,200 ,'200100', '双号')
insert into b values('北京东路', 202 ,400 ,'200200', '双号')
insert into b values('北京东路', 101 ,199 ,'200300', '单号')
insert into b values('北京东路', 201 ,399 ,'200400', '单号')
go

update a
set zipcode = (select top 1 zipcode
from b
where substring(a.address,5,3) between ibegin and iend
and [备注] = (case when substring(a.address,5,3)%2 > 0 then '单号' else '双号' end))
select * from a

drop table a,b

ID Address ZipCode
----------- -------------------- -------
1 北京东路101号 200300
2 北京东路201号 200400
3 北京东路100号 200100
4 北京东路202号 200200

(4 行受影响)
dawugui 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 huangyj 的回复:]
对于门牌号码的位数不一样的可以吗?
比如门牌开始 为 1,结束位为101
[/Quote]如果固定的位数的用substring,如果不固定的,用函数,在7楼两种方法都有.
dawugui 2011-01-21
  • 打赏
  • 举报
回复
--楼主貌似还分单双号的?
create table a(ID int,Address varchar(20),ZipCode varchar(6))
insert into a values(1 ,'北京东路101号','')
insert into a values(2 ,'北京东路201号','')
insert into a values(3 ,'北京东路100号','')
insert into a values(4 ,'北京东路202号','')
create table B(Address varchar(10),iBegin int,iEnd int,Zipcode varchar(10),备注 varchar(10))
insert into b values('北京东路', 100 ,200 ,'200100', '双号')
insert into b values('北京东路', 202 ,400 ,'200200', '双号')
insert into b values('北京东路', 101 ,199 ,'200300', '单号')
insert into b values('北京东路', 201 ,399 ,'200400', '单号')
go

--建立如下函数(非0-9之外的字符删除)
go
create function getnewstr(@oldstr varchar(20)) returns varchar(20)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^0-9]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
go

update a set ZipCode = b.ZipCode
from a , b
where charindex(b.Address,a.Address) > 0 and
dbo.getnewstr(a.Address) between b.iBegin and b.iEnd
and a.Address like('%[^0-9]%')
and
(
dbo.getnewstr(a.Address) % 2 = 1 and b.备注 = '单号' or
dbo.getnewstr(a.Address) % 2 = 0 and b.备注 = '双号'
)

select * from a
/*
ID Address ZipCode
----------- -------------------- -------
1 北京东路101号 200300
2 北京东路201号 200400
3 北京东路100号 200100
4 北京东路202号 200200

(所影响的行数为 4 行)
*/

drop table a , b
drop function dbo.getnewstr


create table a(ID int,Address varchar(20),ZipCode varchar(6))
insert into a values(1 ,'北京东路101号','')
insert into a values(2 ,'北京东路201号','')
insert into a values(3 ,'北京东路100号','')
insert into a values(4 ,'北京东路202号','')
create table B(Address varchar(10),iBegin int,iEnd int,Zipcode varchar(10),备注 varchar(10))
insert into b values('北京东路', 100 ,200 ,'200100', '双号')
insert into b values('北京东路', 202 ,400 ,'200200', '双号')
insert into b values('北京东路', 101 ,199 ,'200300', '单号')
insert into b values('北京东路', 201 ,399 ,'200400', '单号')
go

update a set ZipCode = b.ZipCode
from a , b
where charindex(b.Address,a.Address) > 0 and substring(a.Address,5,3) between b.iBegin and b.iEnd
and
(
substring(a.Address,5,3) % 2 = 1 and b.备注 = '单号' or
substring(a.Address,5,3) % 2 = 0 and b.备注 = '双号'
)


select * from a
/*
ID Address ZipCode
----------- -------------------- -------
1 北京东路101号 200300
2 北京东路201号 200400
3 北京东路100号 200100
4 北京东路202号 200200

(所影响的行数为 4 行)

*/

drop table a , b
huangyj 2011-01-21
  • 打赏
  • 举报
回复
对于门牌号码的位数不一样的可以吗?
比如门牌开始 为 1,结束位为101
叶子 2011-01-21
  • 打赏
  • 举报
回复
一个范围的号,被更新成一个了,岂不是有重号了?
dawugui 2011-01-21
  • 打赏
  • 举报
回复
create table a(ID int,Address varchar(20),ZipCode varchar(6))
insert into a values(1 ,'北京东路101号','')
insert into a values(2 ,'北京东路201号','')
insert into a values(3 ,'北京东路100号','')
insert into a values(4 ,'北京东路202号','')
create table B(Address varchar(10),iBegin int,iEnd int,Zipcode varchar(10),备注 varchar(10))
insert into b values('北京东路', 100 ,200 ,'200100', '双号')
insert into b values('北京东路', 202 ,400 ,'200200', '双号')
insert into b values('北京东路', 101 ,199 ,'200300', '单号')
insert into b values('北京东路', 201 ,399 ,'200400', '单号')
go

--建立如下函数(非0-9之外的字符删除)
go
create function getnewstr(@oldstr varchar(20)) returns varchar(20)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^0-9]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
go

update a set ZipCode = b.ZipCode
from a , b
where charindex(b.Address,a.Address) > 0 and
dbo.getnewstr(a.Address) between b.iBegin and b.iEnd
and a.Address like('%[^0-9]%')

select * from a
/*
ID Address ZipCode
----------- -------------------- -------
1 北京东路101号 200100
2 北京东路201号 200400
3 北京东路100号 200100
4 北京东路202号 200200

(所影响的行数为 4 行)
*/

drop table a , b
drop function dbo.getnewstr
AcHerat 2011-01-21
  • 打赏
  • 举报
回复

create table a(ID int,Address varchar(20),ZipCode varchar(6))
insert into a values(1 ,'北京东路101号','')
insert into a values(2 ,'北京东路201号','')
insert into a values(3 ,'北京东路100号','')
insert into a values(4 ,'北京东路202号','')
go
create table B(Address varchar(10),iBegin int,iEnd int,Zipcode varchar(10),备注 varchar(10))
insert into b values('北京东路', 100 ,200 ,'200100', '双号')
insert into b values('北京东路', 202 ,400 ,'200200', '双号')
insert into b values('北京东路', 101 ,199 ,'200300', '单号')
insert into b values('北京东路', 201 ,399 ,'200400', '单号')
go

update a
set zipcode = (select top 1 zipcode
from b
where substring(a.address,5,3) between ibegin and iend)
select * from a

drop table a,b

ID Address ZipCode
----------- -------------------- -------
1 北京东路101号 200100
2 北京东路201号 200400
3 北京东路100号 200100
4 北京东路202号 200200

(4 行受影响)
dawugui 2011-01-21
  • 打赏
  • 举报
回复
create table a(ID int,Address varchar(20),ZipCode varchar(6))
insert into a values(1 ,'北京东路101号','')
insert into a values(2 ,'北京东路201号','')
insert into a values(3 ,'北京东路100号','')
insert into a values(4 ,'北京东路202号','')
create table B(Address varchar(10),iBegin int,iEnd int,Zipcode varchar(10),备注 varchar(10))
insert into b values('北京东路', 100 ,200 ,'200100', '双号')
insert into b values('北京东路', 202 ,400 ,'200200', '双号')
insert into b values('北京东路', 101 ,199 ,'200300', '单号')
insert into b values('北京东路', 201 ,399 ,'200400', '单号')
go

update a set ZipCode = b.ZipCode
from a , b
where charindex(b.Address,a.Address) > 0 and substring(a.Address,5,3) between b.iBegin and b.iEnd

select * from a
/*
ID Address ZipCode
----------- -------------------- -------
1 北京东路101号 200300
2 北京东路201号 200400
3 北京东路100号 200100
4 北京东路202号 200400

(所影响的行数为 4 行)
*/

drop table a , b
AcHerat 2011-01-21
  • 打赏
  • 举报
回复

update a
set zipcode = (select zipcode
from b
where substring(a.address,5,3) between ibegin and iend)
内容概要:本文档围绕“风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真”展开,系统介绍了采用虚拟同步发电机(VSG)控制策略的风电与储能联合并网系统的建模与仿真方法。通过Simulink平台构建完整的电力系统动态模型,重点实现VSG的关键控制逻辑,以提升新能源并网的稳定性、惯性响应与频率支撑能力。文档不仅涵盖核心仿真模型,还整合了大量相关前沿研究内容,如混合储能调频、微电网优化、电动汽车可调能力评估、智能算法在电力系统中的应用等,并提供丰富的Matlab/Simulink代码实例,具有较强的科研复现价值和技术参考意义。; 适合人群:具备电力系统基础理论知识和Matlab/Simulink仿真能力的研究生、科研人员及从事新能源发电、储能控制、智能电网等领域工作的工程技术人员;特别适用于正在开展风储协同控制、虚拟同步机、构网型变流器等相关课题研究的高校师生。; 使用场景及目标:① 深入理解虚拟同步发电机(VSG)在风储并网系统中的控制原理与技术优势;② 借助提供的仿真模型与代码完成科研论文复现、算法验证与系统性能测试;③ 探索新能源高渗透背景下提升电网稳定性的关键技术路径,包括惯量模拟、一次频率响应、储能协同控制等。; 阅读建议:建议读者按照文档结构循序渐进地学习,优先下载并运行配套的Simulink模型与Matlab代码,结合VSG控制策略的设计细节进行调试与分析,同时可关注公众号“荔枝科研社”获取完整资源包及持续的技术支持,以提升科研效率与创新能力。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧