PostgreSQL函数中SELECT INTO含count(*)报错,移除后正常的原因咨询
问题:PL/pgSQL函数因SELECT子句包含count(*)报错的原因
我编写了如下PL/pgSQL函数,用于获取最热门的主题ID:
create function get_most_frequent_topic(out topic_id integer) as $$ begin select p.topic_id into topic_id, count(*) as freq from post p group by p.topic_id order by count(*) desc limit 1; end; $$ language plpgsql
执行该函数时出现以下错误:
Error occurred during SQL query execution Reason: SQL Error [42601]: ERROR: "count" is not a known variable Position: 123
但当我从SELECT子句中移除count(*)后,函数即可正常运行:
create function get_most_frequent_topic(out topic_id integer) as $$ begin select p.topic_id into topic_id from post p group by p.topic_id order by count(*) desc limit 1; end; $$ language plpgsql
请问这是什么原因?
原因分析
你在第一个函数的SELECT语句里同时选择了p.topic_id和count(*),但函数只定义了一个out参数topic_id来接收查询结果。PL/pgSQL的SELECT ... INTO语法要求查询返回的列数必须和要赋值的变量数量完全匹配——这里查询返回了两列(topic_id和freq),但只有一个变量能接收,数据库会尝试把第二列count(*)的值赋值给名为count的变量,可这个变量根本不存在,所以抛出了"count" is not a known variable的错误。
移除count(*)后,查询只返回一列p.topic_id,刚好和out参数topic_id对应,函数自然能正常执行。
如果确实需要同时获取主题ID和对应的计数,可以给函数加一个额外的out参数,示例如下:
create function get_most_frequent_topic(out topic_id integer, out freq bigint) as $$ begin select p.topic_id, count(*) into topic_id, freq from post p group by p.topic_id order by count(*) desc limit 1; end; $$ language plpgsql
这样就能正确接收两列的查询结果了。
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

