使用分隔符拆分线串

时间:2014-11-24 12:15:53

标签: string split plpgsql

我有一个包含二进制形式坐标的数据库 " 0102000020E610000004000000CEB0074955792B40D7C9CFFC208249406999FB9A9B792B4053550D6723824940E89E1AD4237A2B40A1B0D52F228249402DE86278917A2B4047C1F80E23824940"

我使用St_AsText在LineString中转换它。 我得到像

这样的东西

" Linestring((3.584731 60.739211,3.590472 60.738030,3.592740 60.736220))"

我需要在一个空洞PL / pgSQL-Function中将这个LineString WITH Delimiters拆分。 我的第一个Split会有分隔符',#39;。

结果将是

3.584731 60.739211 3.590472 60.738030 3.592740 60.736220

我的第二个分隔符是' '所以我可以得到每一个点。我知道它很愚蠢,但需要这样做。它是我公司大学的测试项目。 现在我可以用3.590472 * 60.738030 + 3.592740 -60.736220等点来计算。

我的问题是将这个漏洞放在PL / pgSQL函数中,因为我对语言的语法有很大的问题。如果有人可以编写一个示例函数,我将非常感谢:)

1 个答案:

答案 0 :(得分:0)

你不需要开发新功能 - PostgreSQL功能很好 - string_to_array(string, delimiter)

postgres=> select string_to_array('1.0 2.0 3.2', ' ');
 string_to_array 
-----------------
 {1.0,2.0,3.2}
(1 row)

postgres=> select * from  unnest(string_to_array('1.0 2.0 3.2', ' '));
 unnest 
--------
 1.0
 2.0
 3.2
(3 rows)

在plpgsql中解析字符串是错误的想法 - 对较长字符串的某些操作可能会很慢。而且没有必要。 Postgres将函数解析为array,xml,json和(当有必要时)你可以使用regular expressions

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)

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)