oracle字段like多個條件


寫oracle sql時有時候會有 and (字段 like ‘匹配串1’or 字段 like ‘匹配串2’or ...)這樣的情況出現,下面提供一個簡潔點的解決方案:

and REGEXP_LIKE(字段名, '(匹配串1|匹配串2|...)') //全模糊匹配 and REGEXP_LIKE(字段名, '^(匹配串1|匹配串2|...)') ";//右模糊匹配 and REGEXP_LIKE(字段名, '(匹配串1|匹配串2|...)$') ";//左模糊匹配

案例:

某天客戶有一個需求,給定一批的手機號碼或者電話號碼,查詢出相關的通話記錄,以及相關的一些信息。由於客戶給的被叫號碼很不規范,查詢的時候比較麻煩。

分析過程:

我新建了一個表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||%'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM