2009-12-31 52 views
16

Tôi tìm một hàm như regexp_split_to_table, nhưng db của chúng tôi là phiên bản 8.2.9, vì vậy nó không có nó. Tôi thực sự chỉ tách trên một không gian, do đó, một chuỗi nhưsql chia chuỗi theo không gian thành bảng trong postgresql

how now brown cow

sẽ trở

+------+ 
|Column| 
+------+ 
|how | 
|now | 
|brown | 
|cow | 
+------+ 

là có một chức năng đơn giản mà có thể xử lý này, hoặc một cái gì đó tôi phải viết bản thân mình?

Trả lời

34

Bạn có thể chia mảng thành một resultset bằng cách sử dụng hàm không cần thiết nhất, và bạn có thể biến một chuỗi ký tự thành một mảng bằng cách sử dụng hàm string_to_array. Kết hợp cả hai và bạn có được điều này:

alvherre=# select unnest(string_to_array('the quick lazy fox', ' ')); 
unnest 
-------- 
the 
quick 
lazy 
fox 
(4 filas) 

Kể từ 8.2 không có UNNEST, bạn có thể viết nó trong PostgreSQL như thế này:

create or replace function unnest(anyarray) returns setof anyelement 
language sql as $$ 
    select $1[i] from generate_series(array_lower($1, 1), 
            array_upper($1, 1)) as i; 
$$; 
+0

+1 cho * generate_series * và * unnest *. – pilcrow

2

Tôi nghĩ bạn sẽ phải tự mình RETURNS SET hoặc RETURNS TABLE.

câu trả lời Cập nhật: sử dụng PL/pgSQL:

pg=> CREATE OR REPLACE FUNCTION string_to_rows(text) RETURNS SETOF TEXT AS $$ 
    DECLARE 
    elems text[];  
    BEGIN 
    elems := string_to_array($1, ' '); 
    FOR i IN array_lower(elems, 1) .. array_upper(elems, 1) LOOP 
     RETURN NEXT elems[i]; 
    END LOOP; 
    RETURN; 
    END 
$$ LANGUAGE 'plpgsql'; 
CREATE FUNCTION 

pg=> SELECT "Column" FROM string_to_rows('how now brown cow') d("Column"); 
Column 
-------- 
how 
now 
brown 
cow 
(4 rows) 

Original câu trả lời: sử dụng PL/perl:

pg=> CREATE LANGUAGE plperl; 
CREATE LANGUAGE 

pg=> CREATE FUNCTION psplit_to_rows(text) RETURNS SETOF TEXT AS $$ 
pg$> for my $t (split ' ', $_[0]) { return_next $t; } 
pg$> undef; 
pg$> $$ LANGUAGE plperl; 
CREATE FUNCTION 

pg=> SELECT "Column" FROM psplit_to_rows('how now brown cow') d("Column"); 
Column 
-------- 
how 
now 
brown 
cow 
(4 rows) 

Rõ ràng bạn có thể mở rộng này để xử lý một delimiter lựa chọn của bạn , v.v. (Lưu ý, tôi không chắc chắn nếu bạn thực sự muốn cột đó có tên "Cột", yêu cầu định danh trích dẫn để tránh xung đột từ khóa, nhưng, bạn đang ở đây.)

+0

Tôi không có plperl để làm việc với, có thể điều này dễ dàng được thực hiện w/plpgsql? – veilig

+0

@veilig, có, đã cập nhật. – pilcrow

+0

@pilcrow, Chức năng của bạn hoạt động rất tốt, nhưng tôi đang gặp sự cố khi tôi thử thực hiện một truy vấn như [chọn string_to_rows (cột) từ bảng]. Giữ cho tôi lỗi: L ERI: hàm được đặt giá trị được gọi trong ngữ cảnh không thể chấp nhận tập hợp. Nhìn xung quanh trực tuyến Tôi thấy tôi cần gọi như [select * from string_to_rows (text)]. Có thể gọi chức năng này và chuyển vào một bộ không? ie [select * from string_to_rows (chọn col từ bảng)]. – veilig

Các vấn đề liên quan