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

Opdel streng med to skilletegn og konverter type

Hvis du har brug for det mellemliggende trin:

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;

Dette er mere udførligt end regexp_split_to_table() , men kan stadig være hurtigere, fordi regulære udtryk typisk er dyrere. (Test med EXPLAIN ANALYZE .)

Jeg delte først ved ',' , og næste ved ' ' - den omvendte rækkefølge af det, du beskriver, virker mere passende.

Hvis det er nødvendigt, kan du pakke dette ind i en PL/pgSQL-funktion:

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;

Eller bare en SQL-funktion:

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;

Gør det IMMUTABLE for at tillade ydeevneoptimering og andre anvendelser.

Ring (ved at bruge de angivne standardindstillinger for _delim1 og _delim2 ):

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

Eller:

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

Hurtigste

For at få den bedste ydeevne skal du kombinere translate() med unnest(string_to_array(...)) :

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


  1. MariaDB LENGTHB() Forklaret

  2. Forespørg en specifik JSON-kolonne (postgres) med sqlalchemy

  3. Hvordan opretter man automatisk inkrementering / SERIAL id-kolonne på DBeaver ved hjælp af PostgreSQL?

  4. MySQL - Kan ikke oprette visning med SET variabel indeni