Подтвердить что ты не робот

Оператор PostgreSQL IF

Как я могу выполнить такой запрос в Postgres?

IF (select count(*) from orders) > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
4b9b3361

Ответ 1

Пытаться:

DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
   DELETE FROM orders;
ELSE 
   INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$

Основные моменты

  • В стандартном SQL нет процедурных элементов. Оператор IF является частью процедурного языка по умолчанию PL/pgSQL. Вам нужно создать функцию или выполнить специальный оператор с помощью команды DO.

  • Вам нужна ; в конце каждого оператора в plpgsql (кроме последнего END).

  • Вам нужно END IF; в конце заявления IF.

  • Подвыбор должен быть заключен в круглые скобки:

    IF (SELECT count(*) FROM orders) > 0 ...
    

    Или же:

    IF (SELECT count(*) > 0 FROM orders) ...
    

    Это эквивалентно и намного быстрее, хотя:

    IF EXISTS (SELECT FROM orders) ...
    

альтернатива

Вам на самом деле здесь вообще не нужен дополнительный SELECT. Это делает то же самое, немного быстрее:

DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
   INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$

Хотя маловероятно, что одновременная транзакция, пытающаяся выполнить запись в одну и ту же таблицу, может помешать. Чтобы быть абсолютно уверенным, запишите запись в той же транзакции, прежде чем продолжить, как показано.

Ответ 2

Просто чтобы помочь, если кто-нибудь споткнется на этот вопрос, как я, если вы хотите использовать, если в PostgreSQL вы используете "CASE"

select 
    case
        when stage = 1 then 'running'
        when stage = 2 then 'done'
        when stage = 3 then 'stopped'
    else 
        'not running'
    end as run_status from processes

Ответ 3

Из docs

IF boolean-expression THEN
    statements
ELSE
    statements
END IF;

Итак, в приведенном выше примере код должен выглядеть следующим образом:

IF select count(*) from orders > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
END IF;

Вам не хватало: END IF;