Sql 优化触发器中的IF-THEN-ELSE

Sql 优化触发器中的IF-THEN-ELSE,sql,postgresql,optimization,Sql,Postgresql,Optimization,我有一个触发器,需要在电话号码上进行匹配,到目前为止这是可行的,但它似乎没有得到优化: IF NEW.caller LIKE '44%' THEN caller_tmp := SUBSTRING(NEW.caller FROM 3); IF caller_tmp ~ '^[0-9]+$' THEN NEW.caller_name := (SELECT phonenumber_name FROM phonebook WHERE caller_tmp::BIGINT

我有一个触发器,需要在电话号码上进行匹配,到目前为止这是可行的,但它似乎没有得到优化:

IF NEW.caller LIKE '44%' THEN
    caller_tmp := SUBSTRING(NEW.caller FROM 3);
    IF caller_tmp ~ '^[0-9]+$' THEN
        NEW.caller_name := (SELECT phonenumber_name FROM phonebook WHERE caller_tmp::BIGINT LIMIT 1);
    END IF;
ELSEIF NEW.caller LIKE '+44%' THEN
    caller_tmp := SUBSTRING(NEW.caller FROM 4);
    IF caller_tmp ~ '^[0-9]+$' THEN
        NEW.caller_name := (SELECT phonenumber_name FROM phonebook WHERE caller_tmp::BIGINT LIMIT 1);
    END IF;
ELSEIF NEW.caller LIKE '0044%' THEN
    caller_tmp := SUBSTRING(NEW.caller FROM 5);
    IF caller_tmp ~ '^[0-9]+$' THEN
        NEW.caller_name := (SELECT phonenumber_name FROM phonebook WHERE caller_tmp::BIGINT LIMIT 1);
    END IF;
END IF;
我需要检查电话号码是否来自英国,前面包含44、+44或0044。如果是,我需要检查它是否是有效的整数,然后进行匹配


是否可以对此进行优化以获得更好的性能?

其中caller::BIGINT
是无效条件。这里需要一个布尔表达式,而不是数字。而且,如果您在
电话簿
表中有超过一行,那么这将非常失败。正确,已更新。复制粘贴了我正在测试的错误查询。比这个优化更好吗?几乎没有(无论如何,您很可能至少运行一个模式匹配)。更可读/更简单?对F.ex。使用
子字符串(调用者来自“^(?:\+\12400)44([0-9]+)$”)
--
调用者临时:=regexp\u replace(new.caller,“^00”\+”,”)
似乎像这样做了类似调用者临时:=regexp\u replace(new.caller,“^00”\+”,“”)的技巧,但是有没有办法一次检查新的调用者是否包含44、+44或0044,然后进行regexp\u replace?因为如果该号码不是英国号码,我将不会与之“有任何关系”。
其中caller::BIGINT
是无效条件。这里需要一个布尔表达式,而不是数字。而且,如果您在
电话簿
表中有超过一行,那么这将非常失败。正确,已更新。复制粘贴了我正在测试的错误查询。比这个优化更好吗?几乎没有(无论如何,您很可能至少运行一个模式匹配)。更可读/更简单?对F.ex。使用
子字符串(调用者来自“^(?:\+\12400)44([0-9]+)$”)
--
调用者临时:=regexp\u replace(new.caller,“^00”\+”,”)
似乎像这样做了类似调用者临时:=regexp\u replace(new.caller,“^00”\+”,“”)的技巧,但是有没有办法一次检查新的调用者是否包含44、+44或0044,然后进行regexp\u replace?因为如果这个号码不是英国的号码,我就不会和它“有任何关系”。