Структура управления PostgreSQL IF-THEN-ELSE

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

syntax error at or near "IF"

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

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

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

Ответ 1

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

Вы не можете использовать заявления PL/pgSQL вне функций plpgsql. И если этот фрагмент из функции 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 не имеет смысла.

Ответ 2

Вы не включаете эту структуру управления PL/pgSQL в анонимный блок или функцию PL/pgSQL.

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

Ответ 3

Вы не включаете этот PL/pgSQL. Они должны быть заключены с анонимным блоком кода. Пример для вашего кода:

DO $$ BEGIN

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

END$$;