Se você precisar da etapa intermediária:
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;
Isso é mais detalhado do que
regexp_split_to_table()
, mas ainda pode ser mais rápido porque as expressões regulares geralmente são mais caras. (Teste com EXPLAIN ANALYZE
.) Eu primeiro divido em
','
, e em seguida em ' '
- a sequência inversa do que você descreve parece mais adequada. Se necessário, você pode envolver isso em uma função 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;
Ou apenas uma função 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;
Torne-o
IMMUTABLE
para permitir a otimização de desempenho e outros usos. Chamada (usando os padrões fornecidos para
_delim1
e _delim2
):SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030');
Ou:
SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030', ',', ' ');
Mais rápido
Para obter o melhor desempenho, combine
translate()
com unnest(string_to_array(...))
:SELECT unnest(
string_to_array(
translate('3.584731 60.739211,3.590472 60.738030', ' ', ',')
, ','
)
)::float8