PostgreSQL,从列中选择最佳匹配

时间:2018-09-05 08:24:04

标签: sql postgresql

我在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}},因为这是最佳匹配。

2 个答案:

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