2015-06-15 4 views
3

Мне нужно реализовать условный оператор SELECT на основе результата другого оператора. Я не хочу создавать функцию для этой цели, но просто используя условный SELECT.Условный оператор PostgreSQL

Мой неудачный подход выглядит, как показано ниже:

DO 
$do$ 
BEGIN 
IF SELECT count(*) FROM table1 < 1 THEN 
    SELECT * FROM table2; 
    RETURN QUERY; 

ELSE 
    SELECT * FROM table3; 
    RETURN QUERY; 
END IF; 
END 
$do$ 

Я мог бы добиться того же результата, проверяя результаты моего запроса в PHP и на этой основе выполнить еще один запрос, но мне интересно, если это это можно сделать только в PostgreSQL.

+0

@NickBarnes Я редактировал пост: первый запрос должен рассчитывать результаты и основанный на том, что другой запрос должен возвращать результаты. Все запросы в моем конкретном случае довольно длинные, поэтому я решил заменить их более простым эквивалентом. Если вы спросите о столбцах, все 3 запроса будут иметь одинаковые столбцы. –

+0

'return query' - это ** ** ** оператор. Это должно быть 'return query select ...' - но блок PL/pgSQL не может вернуть ничего, поэтому вы не можете использовать 'return query' там вообще –

+0

@a_horse_with_no_name Хорошая точка, есть ли какой-либо возможный способ сделать PL/pgSQL возвращает запрос? –

ответ

2

Попробуйте это:

with c as (select count(*) cnt from table1) 
select table2.* from table2, c where c.cnt < 1 
union all 
select table3.* from table3, c where c.cnt >= 1 
+3

В общем случае, если вы хотите знать, что запрос не существует, лучше НЕ СУЩЕСТВУЕТ, чем COUNT (*) <1 – acesargl

+0

Да. Если условие касается только существования (например, в вопросе), то «EXISTS», безусловно, предпочтительнее. –

+0

@acesargl с использованием 'with' является предпочтительным, если вы хотите использовать' SELECT' несколько раз, вы также можете использовать 'with' в своем ответе;). –

2

Если table2 и Таблица3 являются союзно-совместимыми, то вы можете использовать один SELECT:

SELECT * FROM table2 WHERE NOT EXISTS(SELECT * FROM table1) 
UNION 
SELECT * FROM table3 WHERE EXISTS(SELECT * FROM table1); 
+3

В качестве проблемы с производительностью используйте 'UNION ALL' вместо 'СОЮЗ';). –

+0

@ shA.t Конечно, вы правы. – acesargl

+0

Я также предлагаю вам использовать 'SELECT 1 FROM table1' вместо' SELECT * FROM table1';;). –

Смежные вопросы