Ако имате нужда от междинната стъпка:
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