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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:27:01