sql >> Databáze >  >> RDS >> PostgreSQL

Rozdělit řetězec se dvěma oddělovači a typem převodu

Pokud potřebujete přechodný krok:

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;

Toto je podrobnější než regexp_split_to_table() , ale stále může být rychlejší, protože regulární výrazy jsou obvykle dražší. (Otestujte pomocí EXPLAIN ANALYZE .)

Nejprve jsem se rozdělil na ',' a další na ' ' - obrácená posloupnost toho, co popisujete, se zdá být adekvátnější.

V případě potřeby to můžete zabalit do funkce 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;

Nebo jen funkce 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;

Udělejte to IMMUTABLE umožňující optimalizaci výkonu a další použití.

Zavolejte (pomocí poskytnutých výchozích hodnot pro _delim1 a _delim2 ):

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

Nebo:

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

Nejrychlejší

Pro špičkový výkon zkombinujte translate() pomocí unnest(string_to_array(...)) :

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


  1. Jak mohu namapovat datum Java na DATETIME v mysql (ve výchozím nastavení je to TIMESTAMP) s poznámkami Hibernate

  2. Mysql dyanmická hodnota jako alias

  3. Použití Levenshteinovy ​​funkce na každý prvek v tsvektoru?

  4. Jak zahrnout schéma databáze MySQL na GitHub?