Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql plpgsql返回一行或另一行_Postgresql_Plpgsql - Fatal编程技术网

Postgresql plpgsql返回一行或另一行

Postgresql plpgsql返回一行或另一行,postgresql,plpgsql,Postgresql,Plpgsql,我想在函数中以两种不同的方式查找数据,并在找到结果后立即返回 首先,我想运行一个查询,如 从company.id=x的公司中选择* 然后,如果没有返回结果,请尝试这样的查询 select company.* from company join company_alias on company.id = company_alias.company_id where company_alias.company_alias_id = x; 目前,我正在使用一个un

我想在函数中以两种不同的方式查找数据,并在找到结果后立即返回

首先,我想运行一个查询,如

从company.id=x的公司中选择*

然后,如果没有返回结果,请尝试这样的查询

select company.*
  from
    company
  join
    company_alias on company.id = company_alias.company_id
  where
    company_alias.company_alias_id = x;
目前,我正在使用一个
union all

create or replace function get_payer(x int) returns company as $$
  select * from company where company.id = x
  union all
  select company.*
  from
    company
  join
    company_alias on company.id = company_alias.company_id
  where
    company_alias.company_alias_id = x;
$$ language sql stable
set search_path from current;
这似乎效率不高,因为我总是运行两个查询。但我不知道如何在plpgsql函数中构造一个条件来处理这个问题

我已经尝试了以下的变化,但没有任何运气

create or replace function payment_claim_payer(x int) returns company as $$
declare found_company company;
begin

  select * from company where company.id = x into found_company;

  if not exists found_company then
    select
      company.*
    from
      company
    join
      company_alias on company.id = company_alias.company_id
    where
      company_alias.company_alias_id = x into found_company;
  end if;

  return found_company;

end;
$$ language plpgsql stable
set search_path from current;

你最后一次尝试差点被击中。您需要一个plpgsql(非sql)函数,并应检查特殊变量:


您想要返回
*
还是只想返回
公司名称/id
?@JuanCarlosOropeza:这是Oracle PL/SQL手册-与Postgres的PL/pgSQL无关
create or replace function payment_claim_payer(x int) 
returns company language plpgsql as $$
declare found_company company;
begin
    select * 
    from company 
    where company.id = x 
    into found_company;

    if not found then
        select company.*
        from company
        join company_alias on company.id = company_alias.company_id
        where company_alias.company_alias_id = x 
        into found_company;
    end if;

    return found_company;
end;
$$;