我正在尋找一種有效的方法來查詢 postgreSQL 資料庫,方法是洗掉字串中最右邊的字符,直到找到匹配項。例如,如果我的撥號號碼是,442079285200那么它應該從序列末尾洗掉字符,最終匹配到 UNITED KINGDOM-LONDON 44207。
442079285200-> 不匹配44207928520-> 不匹配4420792852-> 不匹配442079285-> 不匹配44207928-> 不匹配4420792-> 不匹配442079-> 不匹配44207-> 匹配英國-倫敦
v_destination_rates
| 目的地 | dialing_code | 當前利率 | 舍入規則 |
|---|---|---|---|
| 國際海事衛星組織 | 870 | 10.8239 | 1-1-1 |
| 國際網路 | 882 | 10.8239 | 1-1-1 |
| 國際網路 | 883 | 10.8239 | 1-1-1 |
| 銥 | 521844207 | 5.1167 | 1-1-1 |
| 英國-倫敦 | 44207 | 0.0056 | 1-1-1 |
我知道這樣做的一種方法是遍歷撥號號碼 (n) 中的字符數,并對最左邊的 n 個字符進行選擇查詢。我沒有成功運行我的查詢,但我相信它看起來類似于:
$do$
DECLARE
m varchar := '442079285200';
BEGIN
FOR counter IN LENGTH(m)..1 loop
select destination from v_destination_rates where v_destination_rates.dialing_code = left(dialing_number, counter);
END LOOP;
END
$do$
我想知道是否有更有效的方法來執行此查詢,也許使用 LIKE 通配符運算子?我們有數千個撥號號碼可以匹配大約 20 000 個 dialing_code,因此更便宜的操作將是首選。
uj5u.com熱心網友回復:
您還沒有說是否dialing_number來自表格/經過清理的用戶輸入/其他內容。
為簡單起見,我假設它來自一個表contacts,并且您希望按照您的描述回傳其中的所有內容contacts和連接的每一列。v_destination_rates
不使用 pl/pgSQL:
SELECT
*
FROM contacts c
LEFT JOIN v_destination_rates vdr
ON vdr.dialing_code::TEXT LIKE c.dialing_number::TEXT || '%'
我已經在一個包含 9,000 條記錄的表上對此進行了測驗,我假設它與查找表一樣大或更大v_destination_rates,并且在不到十分之一秒的時間內匹配了 16 個樣本整數。
如果撥號代碼已經是 type ,并且按字典順序編入索引,那么您可能會獲得更好的性能TEXT,因為這就是您在此處搜索的方式。
uj5u.com熱心網友回復:
我通常盡可能避免使用正則運算式和喜歡/類似的搜索;他們很慢。在這種情況下,它們是完全可以避免的,您可以使用substringandlength并進行相等匹配。(是的,2 個子例程與正則運算式,這是一個折騰)。以下就是這樣做的,當發生多個匹配時,它會選擇最長的匹配。(見演示)
with dialing_number (dn) as
( values ('442079285200') )
select dr.*
from dialing_number
join v_destination_rates dr
on dr.dialing_code = substring(dn,1, length(dr.dialing_code))
order by length(dr.dialing_code) desc
limit 1 ;
關于性能,20000 個搜索集是要搜索的非常少的條目數。出于好奇,我生成了隨機dialing_code值,直到上述查詢花費了 1 秒以上。這發生在 1.07 秒內搜索了 4755006 行。
uj5u.com熱心網友回復:
我想知道是否有更有效的方式來執行這個查詢
是的,決議號碼以獲取國家和撥號代碼。有許多現有的庫可以做到這一點。然后連接它們并搜索。
例如,442079285200是國家代碼 44 和撥號代碼 20(207 已過時)。然后你會搜索“4420”。
注意:870、882和883不是撥號代碼,它們是國家代碼。而銥是 881。將國家代碼與撥號代碼混淆可能會導致更多問題,您最好將它們分開在表格中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/492779.html
標籤:sql 数据库 PostgreSQL
