PostgreSQL函数中如何获取SELECT查询返回的行数?
你现有写法的核心问题有两个:
SELECT * INTO 单个record变量的语法,只要查询返回超过1行就会直接抛出运行时错误,根本不会执行后续的判断逻辑_person是单行记录类型,本身没有length属性,该判断语句本身就不生效
方案1:数组存储匹配结果,直接读取长度
适合匹配结果量级小的场景,代码简洁易读:
create or replace function search_users(partial_name text) returns setof text as $$ declare _person_names text[]; begin select array_agg(name) into _person_names from users where name ~ partial_name; if array_length(_person_names, 1) is null then return next 'No matching user'; elsif array_length(_person_names, 1) > 1 then return next 'Ambiguous user name'; else return next _person_names[1]; end if; end; $$ language plpgsql;
方案2:LIMIT 2预判断,性能更优
适合可能有大量匹配结果的场景,不需要全量扫描符合条件的行,只要查到2条就可以终止判断,执行效率更高:
create or replace function search_users(partial_name text) returns setof text as $$ declare _match_cnt int; _target_name text; begin select count(*), min(name) into _match_cnt, _target_name from ( select name from users where name ~ partial_name limit 2 ) limited_match; if _match_cnt = 0 then return next 'No matching user'; elsif _match_cnt > 1 then return next 'Ambiguous user name'; else return next _target_name; end if; end; $$ language plpgsql;
内容的提问来源于stack exchange,提问作者ske
相关产品推荐
相关产品推荐

