我想要實作一個這樣的查詢電話歸屬地功能:
在A表查詢出電話后,判斷出他是座機還是手機號,如果是手機號則關聯B表中的ADPHOE欄位,如果是座機號則關聯B表中的ADCODE 我應該要怎么實作會比較好呢?
uj5u.com熱心網友回復:
表名和表欄位名,都分別列下,要不然別人不好寫SQL陳述句。uj5u.com熱心網友回復:
1.A表的電話對應哪個欄位?2.是用A表的電話關聯B表的ADPHOE欄位或ADCODE欄位嗎?
平時多注意提問的方式。
uj5u.com熱心網友回復:
A表中caller欄位是存放電話號碼的,B表中adphone和adcode是分別區分手機號和座機號的歸屬地的uj5u.com熱心網友回復:
好的,第一次發帖還不太會提問...主要是leftjoin的時候要動態判斷這個電話是該和adphoe匹配還是和adcode匹配LEFT JOIN AD_ATTRIBUTION aa ON
CASE
WHEN LENGTH (rtrim(n.calling_pty)) =12 THEN
RTRIM(aa.ADCODE)
--SUBSTR (RTRIM(n.calling_pty), 1, 4)
WHEN LENGTH(rtrim(n.calling_pty)) =11 THEN
(
CASE
WHEN SUBSTR (RTRIM(n.calling_pty), 1, 1) = '0' THEN
RTRIM(aa.ADCODE)
--SUBSTR (rtrim(n.calling_pty), 1, 4)
ELSE
RTRIM(aa.ADPHONE)
--SUBSTR (RTRIM(n.calling_pty), 1, 7)
END
)
END = CASE
WHEN LENGTH (rtrim(n.calling_pty)) =12 THEN
SUBSTR (RTRIM(n.calling_pty), 1, 4)
WHEN LENGTH(rtrim(n.calling_pty)) =11 THEN
(
CASE
WHEN SUBSTR (RTRIM(n.calling_pty), 1, 1) = '0' THEN
SUBSTR (rtrim(n.calling_pty), 1, 4)
ELSE
SUBSTR (RTRIM(n.calling_pty), 1, 7)
END
)
END
我判斷現在用的這個方法,非常慢想知道有沒有效率更高的方法
uj5u.com熱心網友回復:
select a.*
from a
left join b on a.caller = decode( regexp_instr(a.caller,'^1[3458]\d{9}$'),1,b.adphone,b.adcode);
或者:
[-code=sql]
select a.*
from a
left join b on a.caller = decode( regexp_instr(a.caller,'^(010|02\d|0[3-9]\d{2})?\d{6,8}$'),1,b.adcode,b.adphone);
[/code]
uj5u.com熱心網友回復:
或者:
select a.*
from a
left join b on a.caller = decode( regexp_instr(a.caller,'^(010|02\d|0[3-9]\d{2})?\d{6,8}$'),1,b.adcode,b.adphone);
uj5u.com熱心網友回復:
decode( regexp_instr(a.caller,'^1[3458]\d{9}$'),1,b.adphone,b.adcode);想問一下 這里的1是匹配成功回傳1嗎 不是應該回傳匹配成功的字串嗎uj5u.com熱心網友回復:
不用外連接的好轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/81505.html
標籤:開發
