根据电话号码的区号确定费率?

gxd305 2005-09-18 03:22:14
我现在做一个数据库
已经有一个表 table1,table2
table1字段如下
电话号码,费率(现在需要填写的)
table2字段如下
电话号码区号,费率(已知)

现在根据table2中的电话号码区号 以及 费率,来填写table1中的费率

比如
table1中有数据
电话号码 费率
01086956565 ----
02956565652 ----
table2中有数据
电话号码区号 费率
010 0.23
029 0.21


即可填写table1为
电话号码 费率
01086956565 0.23
02956565652 0.21

我是这么实现的
首先将table2中的数据用for 循环 一条一条取出来,然后update

update table1 set 费率=feilv where 电话号码 like "电话号码区号*"

这里有几个问题
1。处理的数据量比较大,table1数据10万条左右,table2数据1000条左右(意味着执行update 1000次)
2。电话号码的长度不一样
3。区号长度页不一样,即使区号一样,电话号码长度也不一定相同
所以实现的速度很慢,有没有比较好的方法,使速度快一些

用SQL Server 2000和BCB做的











...全文
220 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxd305 2005-09-20
  • 打赏
  • 举报
回复
.....
gxd305 2005-09-19
  • 打赏
  • 举报
回复
首先谢谢大家的关注
我回去测试了一下,wgsasd311(自强不息)的方法不能解决问题

charindex 返回的是子串在一字符串中首次出现的位置 如果大于0的话和实际需要的
区号和电话号码的前面的几位匹配,就是两个概念了
所以并不能得到正确的匹配

我借用wgsasd311(自强不息)的方法改了一下
update a
set 费率 = b.费率
from table1 a, table2 b
where a.电话号码 like b.电话号码区号+'%'
where a.费率 is null
这样的话在我有的测试数据中可以得到正确的结果

不过还存在一个问题

比如电话区号 有2,232,2324这样的话 实际用"2%","232%",“2324%”
都可以和"23242132525"这个电话号码匹配
那么数据库会怎么样匹配呢
当然我希望的是和最后一个匹配
有没有更好的方法?



bugchen888 2005-09-19
  • 打赏
  • 举报
回复
update a
set 费率 = b.费率
from table1 a, table2 b
where b.电话号码区号 = left(a.电话号码,len(b.电话号码区号))
mtu207 2005-09-18
  • 打赏
  • 举报
回复
wgsasd311(自强不息)真是非常认真!佩服!!


楼主的问题解决了,别忘了给wgsasd311(自强不息)散分哦:)
天地客人 2005-09-18
  • 打赏
  • 举报
回复
楼主搞定了?帮UP了
gxd305 2005-09-18
  • 打赏
  • 举报
回复
太感谢了!!!
wgsasd311 2005-09-18
  • 打赏
  • 举报
回复
declare @qu int
set @qu=(select max(len(电话号码区号)) from table2)
update table1 set 费率=null--初始化
while @qu>0
begin
update a set 费率=b.费率
from table1 a left join table2 b
on charindex(b.电话号码区号,left(a.电话号码,@qu))>0 where a.费率 is not null
set @qu=@qu-1
end
go
wgsasd311 2005-09-18
  • 打赏
  • 举报
回复
---把上面的is not null 改为 is null .
declare @qu int
set @qu=(select max(len(电话号码区号)) from table2)
update table1 set 费率=null--初始化
while @qu>0
begin
update a set 费率=b.费率
from table1 a left join table2 b
on charindex(b.电话号码区号,left(a.电话号码,@qu))>0 where a.费率 is null
set @qu=@qu-1
end
go
wgsasd311 2005-09-18
  • 打赏
  • 举报
回复
--不好意思上面写错了,请试下面:
declare @qu int
set @qu=(select max(len(电话号码区号)) from table2)
update table1 set 费率=null--初始化
while @qu>0
begin
update a set 费率=b.费率
from table1 a left join table2 b
on charindex(b.电话号码区号,left(a.电话号码,@qu))>0 where a.费率 is not null
set @qu=@qu-1
end
go
gxd305 2005-09-18
  • 打赏
  • 举报
回复
先谢谢了!
wgsasd311 2005-09-18
  • 打赏
  • 举报
回复
declare @qu int
set @qu=(select max(len(电话号码区号)) from table2)
update a set 费率=b.费率
from table1 a left join table2 b
on charindex(b.电话号码区号+space(@qu-len(b.电话号码区号)),left(a.电话号码,4))>0
wgsasd311 2005-09-18
  • 打赏
  • 举报
回复
请问下你的区号最长多少们
gxd305 2005-09-18
  • 打赏
  • 举报
回复
首先谢谢二楼的关注
至于能不能实现,我待会儿测试一下

还有个问题
存在这样的区号 01 与 012而他们的费率 并不是一样的
上面的方式可以实现吗

顺便说一下由于是 国际长途电话号码,区号的位数有两位的 ,三位的,。。。还有5位的
wgsasd311 2005-09-18
  • 打赏
  • 举报
回复
update a set 费率=b.费率
from table1 a left join table2 b
on charindex(b.电话号码区号,left(a.电话号码,4))>0
电话计费系统操作说明 (一)运行环境: 本系统在普通的电脑均可运行,配备内存和硬盘,VGA彩显(或VGA单 显)和DOS5.0以上或WINDOWS95操作系统.软件具有齐全的费率数据, 有自动计费和手动计费两种.本计费卡免接地线,安装简易. (二)安装 软件安装: A:\>INSTALL(回车) 硬件安装:(4路,6路,8路,12路,14路,16路,20路,24路计费卡) (1).把计费卡插入计算机扩展槽, (2).短线9针头接计费卡,9孔头接计算机串行口(COM1/COM2) (3).25针的接线头接计费卡. 电话线输入和输出请看连接线标签. 电话接线: 1.黑--黑 2.绿--绿 3.蓝--蓝 4.红--红 5.橙--橙 6.棕--棕 7.紫--淡红 8.黄--白 (三)运行 主文件TEL.EXE: C:\>CD\JFS(回车) C:\JFS>TEL(回车) (四)操作 数字键"1"--"8" 代表8路电话线路:开通或锁机 "F3"+(1~~4) 打印选项(1.补话单 2.本日累计 3.市话要打印吗 4.通话毕锁机否? 9.打印前空行数0-7) "F4"+分机(1-8)(或"+"+分机) 强计费(手动强计费) "F5"+分机(1-8) 改变是否准许拨打国际长话 (国际无权=>国际有权=>国内长话=>本地市话=>国际无权) "F6"+"6666" 工作日=>双休日=>节假日=>工作日(半价切换) "F7"+"9394" 显示当天业务量累计, 再按Enter键结束显示 "F8"+" " "F9" +分机(1-8) "F10"+分机(1-8) "↑"与"↓" 查看当日话单,再按"F3"+"1" 打印补话单1 "-" 打印补话单2 "./Del" 打印补话单3 "K" 设置禁止拨打码(如声讯台,IP电话) "C" 改变屏幕背景颜色 "H" 校正系统时间 "V" 押金输入 "B" 长话接入不显示设置如:200,193,17909 "X" 清除屏幕的电话,时间和话费 "P" 打印起始时间输出选择 "*" 时长显示选择分钟或秒数 "Enter" 确认结束 "ALT+Q" 退出计费系统 "F2" 设置(所有分机必须处于锁机状态) 1---基本参数设置(延时参数,锁机设置) 2---长途半价时段设置(要改变长话费率请修改半价系数) 3---本地网费率、国内长话统一费率(0,013)(可按3(n)+1计费) 名称 //开始时段/开始每跳时长/开始每跳费率/每跳时长/每跳费率/手续费/ 增加:国内长话/0 /240 /60 /0.50 /60 /0.30 /0.00 / 国内手机/013 /0 /0 /0 /60 /0.80 /0.00 / 注意:此项设置会使第2项长途半价时段设置失效。 4---国内固定长话费率设置(不用修改) 5---国际费率设置 6---港澳台费率设置 7---GSM013长话费率设置(不用修改) (1)基本参数设置 用户名称:深圳电信代办 路数选择(8/16): 08 接听时长: 600 是否立即打印(Y/N): Y 接听费率: 0.50 市话是否打印(Y/N): N 接听手续费: 0.00 话毕锁机否(Y/N): Y 国内时长: 60 延时时间数: 30 国内费率: 1.00 计费起秒数: 0 国内固定手续费: 1.00 市话时长: 60 国内手机手续费: 1.00 市话费率: 0.50 国际时长: 60 市话手续费: 0.00 国际费率: 8.00 屏幕背景颜色: 0 国际手续费: 2.50 (0:黑,1:蓝,2:绿,3:青,4:红) 注:延时时间 等于0时:反极信自动计费或手动强计费 (有反极信时为0,否则为35) 大于5时:回铃音检测,有则立即计费,无则延时计费 53时:无线固话接入公话 符Y表示:是 符N表示:否

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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