You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:将检查表重复数据的SQL封装为自定义函数

嘿,我来帮你搞定这个PostgreSQL函数的问题~你原来的函数因为返回类型设成了VOID,执行后不会输出任何重复数据的结果,咱们调整一下让它能正确返回你需要的重复记录:

正确的重复数据检测函数

首先,我们需要让函数返回和你查询结果匹配的数据集,这里用TABLE()来定义返回结构是最直观的方式:

CREATE OR REPLACE FUNCTION check_for_duplicates()
RETURNS TABLE(
    id_member INT,  -- 请根据你evidence表的实际字段类型调整
    id_service INT,
    amount NUMERIC,
    date DATE,
    number_of_duplicates BIGINT
) AS $BODY$
BEGIN
    RETURN QUERY
        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类型会让函数不返回任何数据,我们用TABLE()明确指定了返回的每个字段名和类型,一定要和你evidence表中对应字段的类型保持一致哦(比如如果date是TIMESTAMP类型,就把这里的DATE改成TIMESTAMP)。
  • 结果返回方式:使用RETURN QUERY语句来执行你的查询并将结果返回,这是PL/pgSQL中返回多行结果集的标准写法,替代了你原来直接写SELECT的方式(直接SELECT在返回VOID的函数里不会输出内容)。

怎么使用这个函数?

调用起来就像查询普通表一样简单:

SELECT * FROM check_for_duplicates();

可选简化方案:用SQL函数替代PL/pgSQL

如果你的逻辑只是这一段纯查询,其实没必要用PL/pgSQL,直接写SQL函数更简洁高效:

CREATE OR REPLACE FUNCTION check_for_duplicates()
RETURNS TABLE(
    id_member INT,
    id_service INT,
    amount NUMERIC,
    date DATE,
    number_of_duplicates BIGINT
) AS $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;

这个版本的函数执行效率和可读性都很棒,适合这种纯查询的场景。

内容的提问来源于stack exchange,提问作者nwind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:51:58