PostgreSQL函数返回表时如何跳过不符合条件的记录?
问题原因
你的函数核心问题是RETURN NEXT语句的位置错误:不管function_typecar返回值是否为1,循环里都会执行RETURN NEXT。当不满足条件时,输出变量id_r、name_r、year_r没有被重新赋值,会保留上一次符合条件的记录值,导致重复返回之前的有效记录。
解决方案
方案1:调整返回语句位置
把RETURN NEXT移到IF条件块内部,仅当type_car = 1时才返回当前记录:
CREATE OR REPLACE FUNCTION schema.function_test RETURNS TABLE(id_r INTEGER, name_r CHARACTER VARYING, year_r INTEGER) AS $BODY$ DECLARE sql_record RECORD; type_car INTEGER; BEGIN FOR sql_record IN SELECT id, name, year FROM car LOOP SELECT type INTO type_car FROM function_typecar(sql_record.id); IF type_car = 1 THEN id_r := sql_record.id; name_r := sql_record.name; year_r := sql_record.year; RETURN NEXT; -- 仅符合条件时返回记录 END IF; END LOOP; END; $BODY$ LANGUAGE plpgsql;
方案2:用纯SQL重写函数(更高效)
PL/pgSQL循环逐行处理的效率远不如原生SQL查询,直接通过关联子查询筛选符合条件的记录,代码更简洁且性能更优:
CREATE OR REPLACE FUNCTION schema.function_test RETURNS TABLE(id_r INTEGER, name_r CHARACTER VARYING, year_r INTEGER) AS $BODY$ SELECT c.id, c.name, c.year FROM car c WHERE (SELECT type FROM function_typecar(c.id)) = 1; $BODY$ LANGUAGE sql;
内容的提问来源于stack exchange,提问作者Lucho
相关产品推荐
相关产品推荐

