PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Sequência dividida com dois delimitadores e tipo de conversão


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