9.3 trở lên:truy vấn bên
Trong PostgreSQL 9.3 hoặc mới hơn, sử dụng truy vấn bên ngầm:
SELECT f.* FROM things t, some_function(t.thing_id) f;
Ưu tiên công thức này cho tất cả các truy vấn mới . Trên đây là công thức tiêu chuẩn .
Nó cũng hoạt động đúng với các chức năng RETURNS TABLE
hoặc RETURNS SETOF RECORD
cũng như các funcs có thông số ngoài RETURNS RECORD
.
Nó viết tắt của:
SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;
Trước 9.3:mở rộng ký tự đại diện (cẩn thận)
Các phiên bản trước, gây ra đánh giá nhiều lần đối với some_function
, không không hoạt động nếu some_function
trả về một tập hợp, không sử dụng tập hợp này :
SELECT (some_function(thing_id)).* FROM things;
Các phiên bản trước, tránh đánh giá nhiều lần some_function
bằng cách sử dụng lớp thứ hai của hướng dẫn. Chỉ sử dụng điều này nếu bạn phải hỗ trợ các phiên bản PostgreSQL khá cũ.
SELECT (f).*
FROM (
SELECT some_function(thing_id) f
FROM things
) sub(f);
Bản trình diễn:
Thiết lập:
CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'evaluated with %',i;
x := i;
y := i::text;
z := 'dummy';
RETURN;
END;
$$;
create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);
chạy thử nghiệm:
demo=> SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE: evaluated with 1
NOTICE: evaluated with 2
NOTICE: evaluated with 3
x | y | z
---+---+-------
1 | 1 | dummy
2 | 2 | dummy
3 | 3 | dummy
(3 rows)
demo=> SELECT (some_function(thing_id)).* FROM things;
NOTICE: evaluated with 1
NOTICE: evaluated with 1
NOTICE: evaluated with 1
NOTICE: evaluated with 2
NOTICE: evaluated with 2
NOTICE: evaluated with 2
NOTICE: evaluated with 3
NOTICE: evaluated with 3
NOTICE: evaluated with 3
x | y | z
---+---+-------
1 | 1 | dummy
2 | 2 | dummy
3 | 3 | dummy
(3 rows)
demo=> SELECT (f).*
FROM (
SELECT some_function(thing_id) f
FROM things
) sub(f);
NOTICE: evaluated with 1
NOTICE: evaluated with 2
NOTICE: evaluated with 3
x | y | z
---+---+-------
1 | 1 | dummy
2 | 2 | dummy
3 | 3 | dummy
(3 rows)