中間ステップが必要な場合:
SELECT unnest(string_to_array(a, ' '))::float8
-- or do something else with the derived table
FROM unnest(string_to_array('3.584731 60.739211,3.590472 60.738030', ',')) a;
これは、regexp_split_to_table()
、ただし、正規表現は通常より高価であるため、それでも高速になる可能性があります。 (EXPLAIN ANALYZE
でテスト 。)
最初に','
で分割しました 、次は' '
-あなたが説明することの逆の順序がより適切であるように思われます。
必要に応じて、これをPL/pgSQL関数にラップできます。
CREATE OR REPLACE FUNCTION public.split_string(_str text
, _delim1 text = ','
, _delim2 text = ' ')
RETURNS SETOF float8 AS
$func$
BEGIN
RETURN QUERY
SELECT unnest(string_to_array(a, _delim2))::float8
-- or do something else with the derived table from step 1
FROM unnest(string_to_array(_str, _delim1)) a;
END
$func$ LANGUAGE plpgsql IMMUTABLE;
または単にSQL関数:
CREATE OR REPLACE FUNCTION public.split_string(_str text
, _delim1 text = ','
, _delim2 text = ' ')
RETURNS SETOF float8 AS
$func$
SELECT unnest(string_to_array(a, _delim2))::float8
FROM unnest(string_to_array(_str, _delim1)) a
$func$ LANGUAGE sql IMMUTABLE;
IMMUTABLE
にします パフォーマンスの最適化やその他の用途を可能にするため。
呼び出し(_delim1
に提供されているデフォルトを使用) および_delim2
):
SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030');
または:
SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030', ',', ' ');
最速
最高のパフォーマンスを得るには、translate()
unnest(string_to_array(...))
を使用 :
SELECT unnest(
string_to_array(
translate('3.584731 60.739211,3.590472 60.738030', ' ', ',')
, ','
)
)::float8