PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pisahkan string dengan dua pembatas dan konversikan tipe

Jika Anda memerlukan langkah perantara:

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;

Ini lebih bertele-tele daripada regexp_split_to_table() , tetapi mungkin masih lebih cepat karena ekspresi reguler biasanya lebih mahal. (Uji dengan EXPLAIN ANALYZE .)

Saya pertama kali berpisah di ',' , dan selanjutnya di ' ' - urutan terbalik dari apa yang Anda gambarkan tampaknya lebih memadai.

Jika perlu, Anda dapat membungkusnya menjadi fungsi 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;

Atau hanya fungsi 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;

Jadikan IMMUTABLE untuk memungkinkan pengoptimalan kinerja dan penggunaan lainnya.

Panggilan (menggunakan default yang disediakan untuk _delim1 dan _delim2 ):

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

Atau:

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

Tercepat

Untuk performa terbaik, gabungkan translate() dengan 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. Membuat kueri beberapa tabel dengan hubungan yang kompleks

  2. Cara menyiapkan psycopg2 dengan database Google App Engine PostgreSQL

  3. Rails ActiveRecord Menghubungkan ke Database Postgres yang Salah

  4. Postgre SQL SEPERTI untuk Integer

  5. Dapatkan Ukuran Semua Basis Data di PostgreSQL (psql)