如何在PostgreSQL函数中进行计数?
我在PostgreSQL中有一个表,表1,有5列(列a、列b、列c、列d、列e)。列a是时间戳类型,列b是整数类型。我想创建一个带有两个参数的函数,返回col_b的计数如何在PostgreSQL函数中进行计数?,postgresql,function,count,Postgresql,Function,Count,我在PostgreSQL中有一个表,表1,有5列(列a、列b、列c、列d、列e)。列a是时间戳类型,列b是整数类型。我想创建一个带有两个参数的函数,返回col_b的计数 CREATE or REPLACE FUNCTION first_count (year schema.table1.col_a%type, col_b schema.table1.col_b%type) RETURNS void AS $$ DECLARE contador integer; BEGIN
CREATE or REPLACE FUNCTION first_count (year schema.table1.col_a%type, col_b schema.table1.col_b%type)
RETURNS void AS
$$
DECLARE
contador integer;
BEGIN
SELECT COUNT(col_b) INTO contador
FROM schema.table1
WHERE schema.table1.col_b = col_b AND EXTRACT(year FROM
schema.table1.col_a) = year;
END;
$$
LANGUAGE plpgsql;
这是可行的,但当我试图传递参数时,它会给我一个错误
我使用函数的目的是得到如下查询结果:
SELECT COUNT(col_b)
FROM schema.table1
WHERE col_b = 2216 AND EXTRACT(year FROM schema.table1.col_a) = 2009;
你的函数没有返回任何东西,这就是为什么你没有得到任何结果 您需要将其更改为
返回bigint
,并且不需要PL/pgSQL:
CREATE or REPLACE FUNCTION first_count (year int, col_b schema.table1.col_b%type)
RETURNS bigint --<< here
AS
$$
SELECT COUNT(col_b)
FROM schema.table1
WHERE schema.table1.col_b = col_b
AND EXTRACT(year FROM schema.table1.col_a) = year;
$$
language sql;
CREATE或REPLACE FUNCTION first_count(年份int,列b schema.table1.col_b%类型)
返回bigint--的方法与从表列中提取的方法相同。因此:
SELECT COUNT(col_b)
INTO contador
FROM schema.table1
WHERE schema.table1.col_b = first_count.col_b
AND EXTRACT(year FROM schema.table1.col_a) =
extract(year from year) ;
这也说明了为什么列、变量或参数名不太可能出现年份。参数名称有两个注意事项。首先,对参数和表列名使用相同的名称是不好的做法。如果没有适当的限定条件,Postgres将始终采用任何SQL语句中的列名。因此谓词:where schema.table1.col_b=col_b
本质上与where true
相同。避免这种情况的一个非常常见的约定是在参数前面加上“p_u”,因此p_col_A。其次,PergReS不考虑一个保留词,它是SQL标准保留字。更不用说可能与谓词混淆,比如
extract(year from year)
博士后将根据上下文保持笔直;您和其他开发人员会吗?您需要使用SELECT。。。PL/pgSQL中的INTO变量
。@LaurenzAlbe谢谢你的回答,我试图使用INTO,但我不明白。详细介绍了这一点。INTO
在这里有详细说明,请查看本节底部的示例函数(忽略STRICT
部分)。如果这不合理,请在您的问题中向我们展示您试图做什么。谢谢您的回答,我使用将我的问题编辑为。函数工作,但我没有得到计数。谢谢,我尝试了,但我得到了下一个错误:运算符不存在:双精度=没有时区的时间戳这是另一个问题。我假设您的参数的数据类型与列匹配。@Raq:您可能只需要更改year
参数的类型谢谢,year参数是timestamp,我如何更改它?