Вопрос по postgresql, plpgsql, sql – PostgreSQL IF-THEN-ELSE управляющая структура

10

Почему я всегда получаю следующую ошибку от Postgres?

syntax error at or near "IF"

Я читаюPostgreSQL: Документация: 8.3: Структуры управления, Сначала я попытался выполнить сложный запрос (с подзапросом), но затем я попытался выполнить простой, например:

<code>IF 2 <> 0 THEN select * from users; END IF;
</code>

Ошибка все та же. Что я делаю неправильно?

Ваш Ответ

3   ответа
18
IF 2 <> 0 THEN select * from users; END IF;

если этот фрагмент из функции plpgsql, то это тоже ерунда. Вы не можете напрямую вернуть результат запроса, как это делает T-SQL.

CREATE OR REPLACE FUNCTION test(p int)
RETURNS SETOF users AS $$
BEGIN
  IF p = 1 THEN
    RETURN QUERY SELECT * FROM users;
  END IF;
  RETURN;
END;
$$ LANGUAGE plpgsql;

Когда вы хотите получить какой-либо результат от функции, вы должны использовать оператор RETURN - plpgsql знает только функцию, он не поддерживает процедуры - поэтому неограниченный SELECT не имеет смысла.

О, спасибо за ваш ответ тоже. Нет, я просто искал, как заставить того или иного "выбрать" в зависимости от условия в «ЕСЛИ». Так что, как я обнаружил, нет способа сделать это простым способом, например IF (SELECT ...) = 2 THEN SELECT ... ELSE SELECT ... END IF; Elkan
На самом деле IF (выберите a из t) = 2 ТОГДА НУЛЬ; END IF; будет работать, проблема, вероятно, в том, что вы пытаетесь выбрать что-то в контексте, который ничего не возвращает. В этом случае Павел сделал прекрасный пример. Ты можешь использоватьRETURN QUERY принимая во внимание, что вы правильно определили свою функцию.
1

блок анонимного кода, Пример для вашего кода:

DO $$ BEGIN

    IF 2 <> 0 THEN select * from users; END IF;

END$$;
4

анонимный блок или функция PL / pgSQL.

Для версии SQL этой структуры управления см. Документы дляCASE.

Хм ... спасибо большое) Elkan
Однако CASE нельзя использовать на верхнем уровне, только как часть SQL-запроса. Другими словами, его нельзя использовать для управления поведением, которое уже не является частью другого запроса, а именно этого, по-видимому, и хотел исходный вопрос.

Похожие вопросы