Postgres:函数检查表中的重复项

时间:2018-01-29 12:50:14

标签: postgresql stored-functions

我有多个重复的表,我想从这些函数中创建。你可以帮我用这个代码编写一个函数吗?感谢。

SELECT id_member,id_service,amount,date, count(*) as number_of_duplicates
from evidence
GROUP BY id_member,id_service,amount,date
HAVING COUNT(*) > 1;


CREATE OR REPLACE FUNCTION check_for_duplicates()
RETURNS VOID AS
$BODY$
BEGIN
SELECT id_member,id_service,amount,date, count(*) as number_of_duplicates
from evidence
GROUP BY id_member,id_service,amount,date
HAVING COUNT(*) > 1;
END;
$BODY$
LANGUAGE ‘plpgsql‘;

1 个答案:

答案 0 :(得分:2)

如果函数应返回结果集,则需要将其声明为returns table ()returns setof

你也不需要PL / pgSQL函数,一个简单的SQL函数可以做到并且效率更高:

CREATE OR REPLACE FUNCTION check_for_duplicates()
RETURNS table (id_member integer, id_service integer, amount numeric, date date, number_of_duplicates bigint) 
$BODY$
  SELECT id_member,id_service,amount,date, count(*) as number_of_duplicates
  from evidence
  GROUP BY id_member,id_service,amount,date
  HAVING COUNT(*) > 1;
$BODY$
LANGUAGE sql;

您没有向我们展示表evidence的定义,所以我不得不猜测列的数据类型。您需要调整returns table (...)部分中的类型以匹配表中的类型。

话虽如此:我会为这样的事情创建一个视图,而不是函数。

无关,但是:date是列的可怕名称。一个是因为它也是一个关键字,但更重要的是它没有记录该列包含的内容:发布日期?到期日?截止日期?