2014-10-29 657 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是国家代码,不是全部前缀。