我有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
);
謝謝你們的答案。
它可能會更快做'DISTINCT ON(...)'後一個完整的加盟。 – 2014-10-29 14:21:38
一個好的答案不僅僅是代碼。請解釋代碼。 – 2014-10-29 14:24:49
我們只通過DESC排序選擇最長匹配(最長),並限制爲1。 – 2014-10-29 14:38:03