假设我有此函数,该函数返回一个表,该表显示一个人的名字中有多少个字母:
CREATE TABLE people (name varchar);
INSERT INTO people VALUES ('jill');
INSERT INTO people VALUES ('jimmy');
CREATE OR REPLACE FUNCTION letter_count(person people) RETURNS TABLE(letter varchar, count bigint) AS $$
SELECT letter, COUNT(*) count FROM regexp_split_to_table(person.name, '') letter GROUP BY letter
$$ LANGUAGE sql STABLE;
我只想对名称为jill
的人调用该函数,并且希望得到这样的结果,该结果是通过在函数(SELECT letter, COUNT(*) count FROM regexp_split_to_table('jill', '') letter GROUP BY letter;
)中手动调用查询而返回的:
| letter | count |
| ------ | ----- |
| j | 1 |
| i | 1 |
| l | 2 |
如果我尝试此查询:
SELECT letter_count(people.*) FROM people WHERE people.name='jill';
我得到这个结果:
| letter_count |
| ------------ |
| (i,1) |
| (l,2) |
| (j,1) |
我已经尝试了许多其他查询(SELECT * FROM letter_count((SELECT * FROM people WHERE name='jill'));
似乎很有希望),但是没有运气。
这里是一个数据库小提琴,可以重现我所看到的内容:https://www.db-fiddle.com/f/nBqwyGknRHJeWL5sdoFhhJ/0
您将这样的表函数放在了表的FROM
子句中。
通常,横向连接是执行此操作的最佳方法:
SELECT l.*
FROM people
CROSS JOIN LATERAL letter_count(people) AS l
WHERE people.name = 'jill';