我有两个电话号码,一个 a-party 和 b-party,我想找到最匹配的通话费率。
有一个呼叫费率表,其中包含各种 a 方和 b 方号码以及每分钟的费率。
在查找通话费率时,首先会找到参与方中最具体的匹配项。如果找到 b 方匹配,则使用最具体 b 方匹配的费率。如果没有为 a 方找到 b 方匹配,则查看下一个最具体的 a 方匹配以查看它是否具有 b 方匹配。如果未找到匹配项,则必须返回单独的消息。
i.e
call_rates
a-party b-party rate_per_min
6495631234 619234 0.10
6495631 6192 0.12
649 61923 0.09
649 61 0.16
对于上述通话费率,请致电:
a-party: 6495631234
将b-party: 619234567
返回rate_per_min: 0.10
a-party: 6495631111
将b-party: 619234567
返回rate_per_min: 0.12
a-party: 6495631111
将b-party: 611112345
返回rate_per_min: 0.16
a-party: 6495631111
将b-party: 619234566
返回rate_per_min: 0.09
到目前为止,这就是我尝试的方式。这是一个非常粗略的大纲。我在编写存储过程方面经验有限。
我只是在寻找一些关于是否有更好的方法来解决这个问题的建议。调用率表会非常大,所以我可以想象双循环会非常低效。
任何反馈将不胜感激。
DELIMITER //
DROP PROCEDURE IF EXISTS `get_rate`;
CREATE PROCEDURE `get_rate` (a VARCHAR(45), b VARCHAR(45), OUT rate VARCHAR(45))
get_r:BEGIN
DECLARE i, j INT;
DECLARE match_string, result, temp_string VARCHAR(255);
SET j = LENGTH(b);
SET i = LENGTH(a);
WHILE i > 0 DO
SET temp_string = SUBSTRING(a,0,i);
SET result = (SELECT * FROM call_rate_overrides WHERE a_party LIKE CONCAT(temp_string, '%'));
WHILE j > 0 DO
SET temp_string = SUBSTRING(b,0,j);
SET match_string = (SELECT * FROM call_rate_overrides WHERE b_party LIKE CONCAT(temp_string,'%'));
IF ISNOTNULL(match_string) THEN
SET rate = match_string;
LEAVE get_r;
END IF;
SET j = j - 1;
END WHILE;
SET i = i - 1;
END WHILE;
END //