我有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