PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tách chuỗi với hai dấu phân cách và kiểu chuyển đổi

Nếu bạn cần bước trung gian:

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;

Điều này dài dòng hơn regexp_split_to_table() , nhưng vẫn có thể nhanh hơn vì cụm từ thông dụng thường đắt hơn. (Kiểm tra với EXPLAIN ANALYZE .)

Lần đầu tiên tôi tách tại ',' và tiếp theo tại ' ' - trình tự đảo ngược của những gì bạn mô tả có vẻ đầy đủ hơn.

Nếu cần, bạn có thể gói nó thành một hàm 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;

Hoặc chỉ một hàm 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;

Đặt nó thành IMMUTABLE để cho phép tối ưu hóa hiệu suất và các mục đích sử dụng khác.

Gọi (sử dụng các giá trị mặc định được cung cấp cho _delim1_delim2 ):

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

Hoặc:

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

Nhanh nhất

Để có hiệu suất cao nhất, hãy kết hợp translate() với 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. Postgres không thể mở tệp CSV để truy cập đọc:Quyền bị từ chối

  2. Làm cách nào để truy vấn SQL và ActiveRecord.find_by_sql trả về các kết quả khác nhau?

  3. Nhà cung cấp dịch vụ đám mây Deep-Dive:PostgreSQL trên Microsoft Azure

  4. thả db vào postgres

  5. PHP json_encode Sự cố với Dấu gạch chéo ngược và Tên mảng