2014-11-24 154 views
0

我有很多坐标以二进制形式像 “0102000020E610000004000000CEB0074955792B40D7C9CFFC208249406999FB9A9B792B4053550D6723824940E89E1AD4237A2B40A1B0D52F228249402DE86278917A2B4047C1F80E23824940”分割带分隔符

数据库我用St_AsText转换这LineString的线串。 我得到的东西像

“线串((3.584731 60.739211,3.590472 60.738030,3.592740 60.736220))”

我需要一个洞PL/pgSQL的,功能分割带分隔符该线段形式。 我的第一个Split会有分隔符','。

其结果将是

3.584731 60.739211 3.590472 60.738030 3.592740 60.736220

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

我的问题是把这个孔工艺在PL/pgSQL函数,因为我与语言的语法,真正的大问题。如果有人可以写一个例子功能我会真的心存感激:)

回答

0

你并不需要开发新的功能 - PostgreSQL有很好的功能 - 在PLPGSQL 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) 

解析字符串是错误的想法 - 一些可能更长的字符串操作将会很慢。这是没有必要的。 Postgres有解析函数来阵列,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) 
+0

起初,谢谢!我知道这是一个坏主意,但它是一个测试,我们想比较一个PL/pgSQL-Function和一个extern C函数。所以,我需要的PL/pgSQL的-功能:( – sataide 2014-11-25 08:06:38

+0

我更新了我的答复 - 但是 - 这是PLPGSQL错误使用,以及错误的基准 – 2014-11-25 08:31:11

+0

你是我的坏蛋,英雄:))) – sataide 2014-11-25 09:44:47