PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Podziel ciąg z dwoma ogranicznikami i typ konwersji

Jeśli potrzebujesz kroku pośredniego:

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;

To jest bardziej szczegółowe niż regexp_split_to_table() , ale nadal może być szybszy, ponieważ wyrażenia regularne są zazwyczaj droższe. (Przetestuj za pomocą EXPLAIN ANALYZE .)

Najpierw podzieliłem się na ',' , a następnie w ' ' - odwrócona kolejność tego, co opisujesz, wydaje się bardziej odpowiednia.

Jeśli zajdzie taka potrzeba, możesz zapakować to do funkcji 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;

Lub po prostu funkcja 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;

Zrób to IMMUTABLE aby umożliwić optymalizację wydajności i inne zastosowania.

Zadzwoń (używając dostarczonych wartości domyślnych dla _delim1 i _delim2 ):

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

Lub:

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

Najszybszy

Aby uzyskać najwyższą wydajność, połącz translate() z 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. Zapytanie PostgreSQL do liczenia/grupowania według dnia i wyświetlania dni bez danych

  2. Anuluj bieżące/aktywne zapytanie w Ruby on Rails

  3. Postgres brakujący błąd wpisu klauzuli FROM w zapytaniu z klauzulą ​​WITH

  4. dodanie brakującej daty w tabeli w PostgreSQL

  5. Odpowiedniki HEX() i UNHEX() MySQL w Postgresie?