我在PostgreSQL中有一个具有以下结构的表:
table: phonenumbers
columns: user, cc, number_start, number_stop
user
是我的用户ID,cc
是国家代码,sn_start
是数字范围的第一个数字,sn_stop
是数字范围的最后一个数字。
表phonenumbers
可以包含同一国家/地区代码中的多个数字范围,在某些情况下根本没有数字范围。
因此,我首先应该对cc
的最高/最佳匹配进行罚款,然后对number_start
循环的最高/最佳匹配进行罚款,直到number_stop
。
如何为给定号码选择最佳匹配,例如1802569984
?
表中的示例数据可能是:
user, cc, number_start, number_stop
1, 44, null, null
3, 1, null, null
3, 1, 800000000, 900000000
4, 1, 802000000, 803000000
在这种情况下,应选择ID为user
的{{1}},因为这是最佳匹配。
答案 0 :(得分:0)
您可以执行以下操作:
select e.*
from example e
where (e.number_start is null or
e.cc || e.number_start <= '1802569984'
) and
(e.number_end is null or
'1802569984' <= e.cc || e.numer_end
)
order by e.cc desc,
e.number_start desc nulls last,
e.number_last asc nulls last
limit 1;
答案 1 :(得分:0)
更简单的方法,这行得通吗?
SELECT p.*
FROM phonenumbers p
WHERE '1802569984' BETWEEN p.cc || p.number_start AND p.cc || p.number_stop
OR ('1802569984' LIKE (p.cc || '%') AND p.number_start IS NULL)
ORDER BY p.cc || p.number_start DESC NULLS LAST
LIMIT 1;