我有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
);
谢谢你的回答。
答案 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;