【问题标题】:Postgres: Function check duplicates in tablePostgres:功能检查表中的重复项
【发布时间】:2018-01-29 12:50:14
【问题描述】:

我有多个重复的表,我想从这些中创建一个函数。你能帮我用这段代码做一个函数吗?谢谢。

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‘;

【问题讨论】:

  • 所以你想让你的函数简单地返回那个结果?
  • 是的。我无法从这些和平的代码中创建函数。
  • 我认为这是因为您返回 VOID 并且没有输出参数 - 尝试返回一个表而不是?.. 虽然我不明白你为什么要将它包装到 plpgsql - 没有参数,没有变量...

标签: postgresql stored-functions


【解决方案1】:

如果一个函数应该返回一个结果集,它需要声明为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 是一个可怕的列名称。一方面因为它也是一个关键字,但更重要的是它没有记录该列包含的内容:发布日期?有效期?截止日期?

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2014-12-19
    • 2018-02-12
    • 2019-04-13
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多