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
相关产品推荐
相关产品推荐

