具有最佳匹配查询的查找表

时间:2014-09-12 14:05:45

标签: sql postgresql

要查找国家/地区的电话号码前缀,请执行以下查询:

SELECT country_id 
FROM phonenumber_prefix 
WHERE '<myphonnumber>' LIKE prefix ||'%' 
ORDER BY LENGTH(calling_prefix) DESC 
LIMIT 1

要查询表格中的电话号码,我会运行如下查询:

SELECT phonenumber 
FROM phonenumbers 

现在我想将这些查询合并为一个,以获取所有电话号码的国家/地区。我知道我可以将第一个查询放入一个函数,例如getCountry()然后查询

SELECT phonenumber, getCountry(phonenumber) 
FROM phonenumbers

但是有一种方法可以在一个查询中使用连接来执行此操作,我使用的是postgresql 9.2吗?

3 个答案:

答案 0 :(得分:2)

您可以使用相关子查询执行此操作:

SELECT phonenumber,
       (SELECT country_id 
        FROM phonenumber_prefix pp
        WHERE pn.phonenumber LIKE prefix ||'%' 
        ORDER BY LENGTH(calling_prefix) DESC 
        LIMIT 1
       ) as country_id
FROM phonenumbers pn;

答案 1 :(得分:0)

这将为您提供最长匹配前缀的相应国家/地区ID的数字列表:

SELECT * FROM (
  SELECT 
    p.phonenumber, pc.country_id, 
    ROW_NUMBER() OVER (PARTITION BY phonenumber ORDER BY LENGTH(pc.prefix) DESC) rn
  FROM 
    phonenumber_prefix pc INNER JOIN
    phonenumbera p ON p.phonenumber LIKE pc.prefix || '%' ) t
WHERE t.rn = 1

答案 2 :(得分:0)

您可以使用连接执行此操作:

select phonenumber, countryId
from phonenumbers
inner join phonenumber_prefix on phonenumber like prefix||'%'

请注意,这样效率会非常低,因为它无法使用索引进行连接。

您也可以反过来(通过从电话号码的开头提取正确的位数)。这将改善一些事情,因为它将能够使用索引来查找前缀,但它仍然需要拆分每个电话号码。