我如何调用接受表类型参数并返回表的函数?

问题描述 投票:1回答:1

假设我有此函数,该函数返回一个表,该表显示一个人的名字中有多少个字母:

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

postgresql
1个回答
1
投票

您将这样的表函数放在了表的FROM子句中。

通常,横向连接是执行此操作的最佳方法:

SELECT l.*
FROM people
   CROSS JOIN LATERAL letter_count(people) AS l
WHERE people.name = 'jill';
© www.soinside.com 2019 - 2024. All rights reserved.