sql >> Database >  >> RDS >> PostgreSQL

String splitsen met twee scheidingstekens en type converteren

Als u de tussenstap nodig heeft:

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;

Dit is uitgebreider dan regexp_split_to_table() , maar kan nog steeds sneller zijn omdat reguliere expressies doorgaans duurder zijn. (Test met EXPLAIN ANALYZE .)

Ik heb eerst gesplitst op ',' , en vervolgens bij ' ' - de omgekeerde volgorde van wat je beschrijft lijkt meer adequaat.

Indien nodig kunt u dit in een PL/pgSQL-functie inpakken:

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;

Of gewoon een SQL-functie:

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;

Maak het IMMUTABLE om prestatie-optimalisatie en ander gebruik mogelijk te maken.

Bellen (met behulp van de opgegeven standaardwaarden voor _delim1 en _delim2 ):

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

Of:

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

Snelst

Combineer voor topprestaties translate() met unnest(string_to_array(...)) :

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


  1. GEBLOKKEERDE thread tijdens het uitvoeren van de Oracle-procedure vanuit de Java-klasse

  2. Trage zoekopdracht bij gebruik van ORDER BY

  3. Hoe voer ik databasetransacties uit met psycopg2/python db api?

  4. Hoe verschillen onderstaande twee update-instructies in SQL?