PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Dividi la stringa con due delimitatori e converti il ​​tipo

Se hai bisogno del passaggio intermedio:

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;

Questo è più dettagliato di regexp_split_to_table() , ma potrebbe essere comunque più veloce perché le espressioni regolari sono in genere più costose. (Prova con EXPLAIN ANALYZE .)

Ho prima diviso in ',' e poi su ' ' - la sequenza inversa di ciò che descrivi sembra più adeguata.

Se necessario, puoi racchiuderlo in una funzione 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;

O solo una funzione 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;

Rendilo IMMUTABLE per consentire l'ottimizzazione delle prestazioni e altri usi.

Chiama (usando le impostazioni predefinite fornite per _delim1 e _delim2 ):

SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030');

Oppure:

SELECT * FROM split_string('3.584731 60.739211,3.590472 60.738030', ',', ' ');

Il più veloce

Per prestazioni ottimali, combina translate() con unnest(string_to_array(...)) :

SELECT unnest(
          string_to_array(
             translate('3.584731 60.739211,3.590472 60.738030', ' ', ',')
           , ','
          )
       )::float8