String 使用分隔符拆分线条字符串
我有一个数据库,有很多二进制坐标,比如 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等等String 使用分隔符拆分线条字符串,string,split,plpgsql,String,Split,Plpgsql,我有一个数据库,有很多二进制坐标,比如 0102000020E610000004000000CEB007495792B40D7C9CFFC208249406999FB9B792B4053550D6723824940E89E1AD4237A2B40A1B0D52F228249402DE86278917A2B4047C1F80E23824940 我使用St_AsText将其转换为一个行字符串。 我得到的是 线路长度3.584731 60.739211,3.590472 60.738030,3.592
我的问题是把这个洞进程放在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)