2014-11-24 150 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