String 使用分隔符拆分线条字符串

String 使用分隔符拆分线条字符串,string,split,plpgsql,String,Split,Plpgsql,我有一个数据库,有很多二进制坐标,比如 0102000020E610000004000000CEB007495792B40D7C9CFFC208249406999FB9B792B4053550D6723824940E89E1AD4237A2B40A1B0D52F228249402DE86278917A2B4047C1F80E23824940 我使用St_AsText将其转换为一个行字符串。 我得到的是 线路长度3.584731 60.739211,3.590472 60.738030,3.592

我有一个数据库,有很多二进制坐标,比如 0102000020E610000004000000CEB007495792B40D7C9CFFC208249406999FB9B792B4053550D6723824940E89E1AD4237A2B40A1B0D52F228249402DE86278917A2B4047C1F80E23824940

我使用St_AsText将其转换为一个行字符串。 我得到的是

线路长度3.584731 60.739211,3.590472 60.738030,3.592740 60.736220

我需要在孔PL/pgSQL函数中使用分隔符拆分此行字符串。 我的第一次拆分将使用分隔符“,”

结果将是

3.584731 60.739211 3.590472 60.738030 3.592740 60.736220

我的第二个分隔符是“”,因此我可以得到每个点。我知道这很愚蠢,但必须这样做。这是我公司大学的一个测试项目。 现在我可以用点来计算,比如3.590472*60.738030+3.592740-60.736220等等


我的问题是把这个洞进程放在PL/pgSQL函数中,因为我在语言的语法方面有很大的问题。如果有人能编写一个示例函数,我将非常感激:

您不需要开发新函数-PostgreSQL有很好的函数-字符串到数组字符串,分隔符

在plpgsql中解析字符串是错误的想法-在较长字符串上的某些操作可能会很慢。这是没有必要的。Postgres具有对数组、xml、json的解析函数,必要时可以使用

PL/pgSQL中的一些简单拆分字符串实现:

postgres=# \sf split_string 
CREATE OR REPLACE FUNCTION public.split_string(text, text)
RETURNS SETOF text
LANGUAGE plpgsql
AS $function$
DECLARE 
  pos int; 
  delim_length int := length($2);
BEGIN
  WHILE $1 <> ''
  LOOP
    pos := strpos($1, $2);
    IF pos > 0 THEN
      RETURN NEXT substring($1 FROM 1 FOR pos - 1);
      $1 := substring($1 FROM pos + delim_length);
    ELSE
      RETURN NEXT $1;
      EXIT;
    END IF; 
  END LOOP;
  RETURN;
END;
$function$

postgres=# select * from split_string('AHOJ NAZDAR BAZAR',' ');
 split_string 
--------------
 AHOJ
 NAZDAR
 BAZAR
(3 rows)

首先谢谢你!。我知道这是个坏主意,但这是一个测试,我们想比较PL/pgSQL函数和外部C函数。所以我需要PL/pgSQL函数:我更新了我的回复-但是再次-这是plpgsql的错误用法和错误的基准。你是我的大英雄:你将如何使用PL/pgSQL和外部C函数进行基准测试?你必须在工作中选择一个通常可以在plpgsql中实现的过程。人工基准可能真的令人困惑。示例:我在plpgsql中实现了一个快速排序。对于大型阵列,它比C内部快速排序实现慢1000倍。这个基准的好处是什么。绝对零度。没有头脑好的人会使用plpgsql函数进行排序。PLpgSQL是SQL操作的完美粘合剂——因为瓶颈是SQL操作。速度与PHP相当。但对于密集的数字字符串操作,任何人都应该使用PLPython、PLPerl或C。
postgres=> select * from regexp_split_to_table('1.0 2.0   3.3', e'\\s+');
 regexp_split_to_table 
-----------------------
 1.0
 2.0
 3.3
(3 rows)

postgres=> select v[1] from regexp_matches('1.0 2.0   3.3', '[0-9]+\.[0-9]+','g') r(v);
  v  
-----
 1.0
 2.0
 3.3
(3 rows)
postgres=# \sf split_string 
CREATE OR REPLACE FUNCTION public.split_string(text, text)
RETURNS SETOF text
LANGUAGE plpgsql
AS $function$
DECLARE 
  pos int; 
  delim_length int := length($2);
BEGIN
  WHILE $1 <> ''
  LOOP
    pos := strpos($1, $2);
    IF pos > 0 THEN
      RETURN NEXT substring($1 FROM 1 FOR pos - 1);
      $1 := substring($1 FROM pos + delim_length);
    ELSE
      RETURN NEXT $1;
      EXIT;
    END IF; 
  END LOOP;
  RETURN;
END;
$function$

postgres=# select * from split_string('AHOJ NAZDAR BAZAR',' ');
 split_string 
--------------
 AHOJ
 NAZDAR
 BAZAR
(3 rows)