在PostgreSQL中提取拆分字符串的最后一部分最有效的方法是什么?
我想在PostgreSQL函数中将完全限定域的子域提取到第二级 目前,我有以下代码片段可以使用,但我不确定这是否是最有效的方法: 子域:=leftquery,lengthquery-lengthtld; 返回reversesplit_partreversesubdomains',1 | | tld; 可以保证查询以tld子字符串结束 示例:在PostgreSQL中提取拆分字符串的最后一部分最有效的方法是什么?,postgresql,plpgsql,stored-functions,Postgresql,Plpgsql,Stored Functions,我想在PostgreSQL函数中将完全限定域的子域提取到第二级 目前,我有以下代码片段可以使用,但我不确定这是否是最有效的方法: 子域:=leftquery,lengthquery-lengthtld; 返回reversesplit_partreversesubdomains',1 | | tld; 可以保证查询以tld子字符串结束 示例: +---------------------+---------+---------------+ | query | tl
+---------------------+---------+---------------+
| query | tld | output |
+---------------------+---------+---------------+
| abc.example.com | .com | example.com |
| x.y.z.example.co.uk | .co.uk | example.co.uk |
| zzz.123.yyy.com.br | .com.br | yyy.com.br |
+---------------------+---------+---------------+
这个数组的效率也不是很高,但至少不会反转两次,我猜数组的长度很便宜,字符串到数组的成本大概和拆分部分一样高。这可能是错误的,但值得一试
sd_arr := string_to_array(subdomains, '.');
RETURN sd_arr[array_length(sd_arr , 1)] || tld;
稍好一些,不带变量赋值:
将select arr[array_lengtharr,1]从select字符串_返回到_arraysubdomains,'.'作为arr t | | tld;
这个数组的效率也不是很高,但至少不会反转两次,我猜数组的长度很便宜,字符串到数组的成本大概和拆分部分一样高。这可能是错误的,但值得一试
sd_arr := string_to_array(subdomains, '.');
RETURN sd_arr[array_length(sd_arr , 1)] || tld;
稍好一些,不带变量赋值:
将select arr[array_lengtharr,1]从select字符串_返回到_arraysubdomains,'.'作为arr t | | tld;
不确定这是否更有效,但您可以将其与您的实现进行比较:
create or replace function get_domain(p_input text, p_tld text)
returns text
as
$$
declare
l_tld text[];
l_items text[];
begin
l_tld := string_to_array(trim('.' from p_tld), '.');
l_items := string_to_array(trim('.' from p_input), '.');
return array_to_string(l_items[cardinality(l_items) - cardinality(l_tld):], '.');
end
$$
language plpgsql
immutable;
它本质上是将输入和顶级域转换为任何前导的数组。避免空数组元素
然后,它通过从输入的长度中减去长度=tld的元素数来计算要返回的起始元素。对于输入x.y.z.example.co.uk,这是6-2,这意味着它返回从第4个元素开始的所有内容,然后将其转换回虚线符号
不确定这是否更有效,但您可以将其与您的实现进行比较:
create or replace function get_domain(p_input text, p_tld text)
returns text
as
$$
declare
l_tld text[];
l_items text[];
begin
l_tld := string_to_array(trim('.' from p_tld), '.');
l_items := string_to_array(trim('.' from p_input), '.');
return array_to_string(l_items[cardinality(l_items) - cardinality(l_tld):], '.');
end
$$
language plpgsql
immutable;
它本质上是将输入和顶级域转换为任何前导的数组。避免空数组元素
然后,它通过从输入的长度中减去长度=tld的元素数来计算要返回的起始元素。对于输入x.y.z.example.co.uk,这是6-2,这意味着它返回从第4个元素开始的所有内容,然后将其转换回虚线符号
有趣的是,我几乎自己创建了完全相同的备选方案,同时,它具有性能优势,但不幸的是低于1%:有趣的是,我几乎自己创建了完全相同的备选方案,同时,它具有性能优势,但不幸的是低于1%: