Bạn cần phải bật mảng thành một tập hàng. Ví dụ: sử dụng generate_series
:
SELECT ARRAY(SELECT ROUND(ARRAY[1.53224,0.23411234])[i], 2) FROM generate_series(1,2) AS s(i));
Tôi biết điều đó thật xấu xí. Nên có một hàm trợ giúp để tạo các ánh xạ như vậy dễ dàng hơn.
Có lẽ một cái gì đó tương tự (có nó là khủng khiếp, chậm, và giòn mã ðộng):
CREATE OR REPLACE FUNCTION map_with_arg(TEXT, ANYARRAY, TEXT)
RETURNS ANYARRAY
IMMUTABLE STRICT
LANGUAGE 'plpgsql' AS
$$
DECLARE
i INTEGER;
t TEXT;
cmd TEXT;
BEGIN
FOR i IN array_lower($2, 1) .. array_upper($2, 1) LOOP
cmd := 'SELECT ('||quote_ident($1)||'('||quote_nullable($2[i])||', '||quote_nullable($3)||'))::TEXT';
EXECUTE cmd INTO t;
$2[i] := t;
END LOOP;
RETURN $2;
END;
$$;
select map_with_arg('repeat', array['can','to']::TEXT[], '2');
map_with_arg
---------------
{cancan,toto}
Cập nhật Nó xảy ra với tôi rằng chúng ta có thể sử dụng một tuyên bố động duy nhất cho toàn bộ vòng lặp. Điều này có thể giảm thiểu một số mối quan tâm về hiệu suất.
CREATE OR REPLACE FUNCTION map_with_arg(TEXT, ANYARRAY, TEXT)
RETURNS ANYARRAY
IMMUTABLE STRICT
LANGUAGE 'plpgsql' AS
$$
DECLARE
cmd TEXT;
rv TEXT;
BEGIN
cmd := 'SELECT ARRAY(SELECT (' || quote_ident($1)||'($1[i], '||quote_nullable($3)||'))::TEXT FROM generate_subscripts($1, 1) AS gs(i))';
EXECUTE cmd USING $2 INTO rv;
RETURN rv;
END;
$$;
các đề xuất tuyệt vời từ mọi người. Tôi nghĩ rằng tôi sẽ đi với proc được lưu trữ vì tôi cần phải áp dụng loại chức năng 'map' này mọi lúc. Nó sẽ còn lớn hơn nếu tôi có thể chuyển một hàm vào proc được lưu trữ, do đó biến nó thành một nhà máy được lưu trữ proc để chuyển nó thành một hàm 'map' thực sự. Nhưng, điều này sẽ làm việc cho bây giờ. Cảm ơn một lần nữa, tất cả mọi người. – punkish
Re: truyền trong một hàm: Bạn có thể quan tâm đến http://stackoverflow.com/questions/8346065/function-as-parameter-to-another-function-in-postgres. (It's xa lý tưởng, nhưng bạn có thể nhận được một số sử dụng từ nó.) – ruakh