Ответ 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$
Хотя маловероятно, что одновременная транзакция, пытающаяся выполнить запись в одну и ту же таблицу, может помешать. Чтобы быть абсолютно уверенным, запишите запись в той же транзакции, прежде чем продолжить, как показано.