2014-10-29 651 views
0

我有2個表,1個用於檢查電話號碼的類型(固定或移動),另一個是主數據。 數據在PHONE_NUMBER表是這樣的:Postgresql正則表達式得到匹配的電話號碼前綴

number_prefix | type_number 
---------------------------- 
84   | Fixed 
84912   | Mobile 
84917   | Mobile 
... 

而且在call_record數據是這樣的:

cus_number | billsec 
------------------------ 
84912789645 | 48 
8444984356 | 124 
... 

我想對我的查詢類型的數量的客戶數,那麼我使用JOIN/ON和正則表達式作爲條件:

SELECT * FROM call_record as cr 
JOIN phone_number as pn ON cr.cus_number ~ ('^' || pn.number_prefix) 

但是數字'84912789645'的結果返回2條記錄,因爲該數字與'84'和'84912'匹配。

cus_number | billsec | prefix_number | type_number 
----------------------------------------------------- 
84912789645 | 48  | 84912   | Mobile 
84912789645 | 48  | 84   | Fixed 
... 

這是錯誤的,因爲這個數字是手機。在這種情況下,我如何在查詢中獲得匹配結果(僅限Mobile)?

謝謝。

============================================== ===========================

更新。我有這個問題的解決方案。我在條件中使用子查詢來獲得匹配number_prefix。

SELECT * 
FROM phone_number pn, call_record cr 
WHERE pn.number_prefix = (
    SELECT number_prefix 
    FROM phone_number, call_record 
    WHERE (cr.customer_number ~ ('^' || number_prefix)) 
    ORDER BY number_prefix DESC 
    LIMIT 1 
); 

謝謝你們的答案。

回答

0

對於PostgreSQL 9.3

SELECT * 
FROM 
call_record as cr 
LEFT JOIN LATERAL 
    (
     select * from phone_number 
     where cr.cus_number ~ ('^' || number_prefix) 
     ORDER BY number_prefix DESC 
     LIMIT 1 
) phone_number ON TRUE; 
+0

它可能會更快做'DISTINCT ON(...)'後一個完整的加盟。 – 2014-10-29 14:21:38

+0

一個好的答案不僅僅是代碼。請解釋代碼。 – 2014-10-29 14:24:49

+0

我們只通過DESC排序選擇最長匹配(最長),並限制爲1。 – 2014-10-29 14:38:03

0

您應該更改固定行的前綴。在越南,手機號碼可能以84912或84917開頭,但固定線路以841,842,843等開頭。84是國家代碼,不是全部前綴。