Как я могу выполнить такой запрос в Postgres?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
Как я могу выполнить такой запрос в Postgres?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
Пытаться:
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$
Хотя маловероятно, что одновременная транзакция, пытающаяся выполнить запись в одну и ту же таблицу, может помешать. Чтобы быть абсолютно уверенным, запишите запись в той же транзакции, прежде чем продолжить, как показано.
Просто чтобы помочь, если кто-нибудь споткнется на этот вопрос, как я, если вы хотите использовать, если в 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
Из 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;
Вы также можете использовать базовую структуру для PL/pgSQL CASE с блоком процедур блока анонимного кода:
DO $$ BEGIN
CASE
WHEN boolean-expression THEN
statements;
WHEN boolean-expression THEN
statements;
...
ELSE
statements;
END CASE;
END $$;
Рекомендации: