Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中提取拆分字符串的最后一部分最有效的方法是什么?_Postgresql_Plpgsql_Stored Functions - Fatal编程技术网

在PostgreSQL中提取拆分字符串的最后一部分最有效的方法是什么?

在PostgreSQL中提取拆分字符串的最后一部分最有效的方法是什么?,postgresql,plpgsql,stored-functions,Postgresql,Plpgsql,Stored Functions,我想在PostgreSQL函数中将完全限定域的子域提取到第二级 目前,我有以下代码片段可以使用,但我不确定这是否是最有效的方法: 子域:=leftquery,lengthquery-lengthtld; 返回reversesplit_partreversesubdomains',1 | | tld; 可以保证查询以tld子字符串结束 示例: +---------------------+---------+---------------+ | query | tl

我想在PostgreSQL函数中将完全限定域的子域提取到第二级

目前,我有以下代码片段可以使用,但我不确定这是否是最有效的方法:

子域:=leftquery,lengthquery-lengthtld; 返回reversesplit_partreversesubdomains',1 | | tld; 可以保证查询以tld子字符串结束

示例:

+---------------------+---------+---------------+
|        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%: