如何在PostgreSQL函数中进行计数?

如何在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

我在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
    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,我如何更改它?