Postgresql正则表达式获取匹配的电话号码前缀

时间:2014-10-29 13:23:44

标签: regex postgresql phone-number

我有2个表,1个用于检查电话号码的类型(固定或移动),另一个是主数据。 phone_number 表格中的数据如下所示:

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
);

谢谢你的回答。

2 个答案:

答案 0 :(得分:0)

您应该更改固定行的前缀。在越南,手机号码可以从84912或84917开始,但固定线路以841,842,843等开头.84是国家代码,而不是完整的前缀。

答案 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;