10

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

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

syntax error at or near "IF"

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

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

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

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

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

    от
  • О, спасибо за ваш ответ тоже. Нет, я просто искал, как заставить того или иного "выбрать" в зависимости от условия в «ЕСЛИ». Так что, как я обнаружил, нет способа сделать это простым способом, например IF (SELECT ...) = 2 THEN SELECT ... ELSE SELECT ... END IF;

    от Elkan
  • Хм ... спасибо большое)

    от Elkan
  • 1

    Вы не включаете этот PL / pgSQL. Они должны быть приложены с

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

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

  • 4

    Вы не включаете эту управляющую структуру PL / pgSQL в

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

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

  • 18

    Вы не можете использовать операторы PL / pgSQL вне функций plpgsql. И

    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 не имеет смысла.