algorithm – 在ORACLE中搜索最长前缀的最快方法
发布时间:2020-12-12 16:29:44 所属栏目:百科 来源:网络整理
导读:我有一个为大量区域定义的电话号码前缀列表(在由gvcode和cgi定义的查询中). 我需要有效地找到与给定数字PHONE_NR匹配的最长前缀. 我在字段数字上使用反向LIKE子句(其中包含48%,49%,1%,1232%等形式的前缀). 因此我不能在该字段上使用普通索引. 我通过在gv
我有一个为大量区域定义的电话号码前缀列表(在由gvcode和cgi定义的查询中).
我需要有效地找到与给定数字PHONE_NR匹配的最长前缀. 我在字段数字上使用反向LIKE子句(其中包含48%,49%,1%,1232%等形式的前缀). 因此我不能在该字段上使用普通索引. 我通过在gvcode和cgi字段上使用IOT(它们是主键的一部分(前两个cols))设法获得了实质性的改进. 有没有其他方法来执行比这种方法更快的搜索. 这是一个查询,它给出了所有匹配前缀的列表(我在数字长度后对其进行排序). select t.gvcode,t.digits from NUMBERS t where t.gvcode=ZONE_SET_CODE and t.cgi=cgi_f and ( PHONE_NR like t.digits) order by length(digits) desc除了“数字”索引之外,您还可以在rpad(substr(digits,1,length(digits)-1),10,’9′)上创建索引. “10”是您要支持的最大长度.您将为where子句添加一个附加条件:rpad(substr(digits,’9′)> = PHONE_NR 你的SQL将是: select t.gvcode,t.digits from NUMBERS t where t.gvcode=ZONE_SET_CODE and t.cgi=cgi_f and PHONE_NR like t.digits and substr(digits,length(digits)-1) <= PHONE_NR and rpad(substr(digits,'9') >= PHONE_NR order by length(digits) desc 这是sqlfiddle中的一个例子 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |