2016-11-23 7 views
1

Я хочу искать данные по-разному в функции и возвращать, как только я нахожу результат.plpgsql возвращает одну строку или другую

Сначала я хочу запустить запрос типа;

select * from company where 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; 

Это Безразлично» t кажется эффективным, так как я всегда выполняю два запроса. Но я не уверен, как структурировать условие в функции 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; 
+0

вы хотите возвращение '*' или просто 'company_name/id'? –

+0

@JuanCarlosOropeza: это руководство Oracle PL/SQL - это не имеет никакого отношения к Postgres PL/pgSQL –

ответ

1

Ваша последняя попытка была почти попала. Вам нужен plpgsql (не SQL) функцию и должны изучить специальную переменную found:

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; 
$$;