PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Разделете низ с два разделителя и преобразувайте тип

Ако имате нужда от междинната стъпка:

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;

Това е по-подробно от regexp_split_to_table() , но все още може да бъде по-бърз, защото регулярните изрази обикновено са по-скъпи. (Тествайте с EXPLAIN ANALYZE .)

Първо се разделих на ',' и следващ при ' ' - обратната последователност на това, което описвате, изглежда по-адекватна.

Ако е необходимо, можете да обвиете това в 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;

Или просто 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;

Направете го IMMUTABLE за да позволи оптимизиране на производителността и други употреби.

Обадете се (използвайки предоставените настройки по подразбиране за _delim1 и _delim2 ):

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

Или:

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

Най-бързо

За най-добра производителност комбинирайте translate() с unnest(string_to_array(...)) :

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преглед на кеширането за PostgreSQL

  2. Поправка:„операторът не съществува:цяло число || цяло число” в PostgreSQL

  3. Как да отстранявате грешки:Вътрешна грешка текущата транзакция е прекъсната, командите се игнорират до края на блока на транзакция

  4. Rake db:drop не изчиства старите ми маси

  5. Как да осъществя достъп до postgresql на виртуална машина?