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
và _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