我有一个包含二进制形式坐标的数据库 " 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函数中,因为我对语言的语法有很大的问题。如果有人可以编写一个示例函数,我将非常感谢:)
答案 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)