2014-09-12 174 views
0

要查找一個電話號碼前綴的國家,我運行下面的查詢:查找表的最佳匹配查詢

SELECT phonenumber 
FROM phonenumbers 

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

從我運行查詢像一個表中查詢電話號碼

現在我想將這些查詢合併爲一個,以獲取所有電話號碼的國家/地區。我知道我可以將第一個查詢放入一個函數中,例如getCountry(),然後查詢

SELECT phonenumber, getCountry(phonenumber) 
FROM phonenumbers 

但有也與連接在一個查詢做到這一點的方式,我使用PostgreSQL 9.2?

回答

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; 
0

這會給你的數字列表與相應的國家IDS最長前綴匹配:

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

要知道,這將:

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 
0

則可以使用一個加入成爲這樣做效率很低,因爲它不能使用索引進行連接。

你也可以用相反的方法做到這一點(通過從電話號碼開頭提取正確的位數)。這可以改進一點,因爲它可以使用索引來查找前綴,但它仍然需要拆分每個phonenumber。