问题背景描述:
某天客户有一个需求, 给定一批的手机号码或者电话号码, 查询出相关的通话记录, 以及相关的一些信息.
客户给定的被叫号码如图所示:
查询出来的结果如下图所示 (本批次的结果不是上图导入的结果查询的, 为了格式说明, 因此导入两张结果不相关的图片):
由于客户给的被叫号码很不规范, 查询的时候比较麻烦.
分析过程:
我新建了一个表 security_phonebill_callee_num, 用以存放导入的被叫号码信息
所有的通话数据保存在 t_phonebill_201702 中, 想要查询必须要实现 like, 就是以下 sql 的实现效果
- select org_caller_num,org_callee_num,call_seconds,start_time,switch_id,
- in_trunk,out_trunk,settle_carrier,file_name
- from t_phonebill_201702 a
- where a.org_callee_num like '%13800100186%'
但是这样的号码有好多个, 有时候有一百多个, 以上的 sql 只能查询一个号码的通话记录
一开始我想用游标实现, 写一个游标, 把被叫号码放入游标中, 然后写一个循环, 每次都依次查询一下,
但后来发现 t_phonebill_201702 数据量太大, like 一次就要花费时间 20 分钟, 100 个就是 2000 分钟 (30 个小时), 耗时量太大, 效率太低.
后来查阅资料, 多次尝试下写下这个 sql, 总算是实现了查询, 实验论证效率也还不错.
- select org_caller_num,a.org_callee_num,call_seconds,start_time,switch_id,
- in_trunk,out_trunk,settle_carrier,file_name
- from t_phonebill_201702 a
- where exists
- (select 1 from security_phonebill_callee_num c where a.org_callee_num
- like '%||c.org_callee_num||%') ;
如果 t_phonebill_201702 表的数据量不大, 可以考虑使用简版, 简版更易于了解, 也能更清楚明白 like 多个值是如何实现的, 但使用 exists 总是一个好习惯. 如果你有类似的需求, 希望可以帮到你.
- select org_caller_num,a.org_callee_num,call_seconds,start_time,switch_id,
- in_trunk,out_trunk,settle_carrier,file_name
- from t_phonebill_201702 a,security_phonebill_callee_num c
- where a.org_callee_num like '%||c.org_callee_num||%'
来源: http://www.linuxidc.com/Linux/2018-07/153313.htm