PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Instrução IF do PostgreSQL

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

Não há elementos procedurais no SQL padrão. O IF A instrução faz parte da linguagem procedural padrão PL/pgSQL. Você precisa criar uma função ou executar uma instrução ad-hoc com o DO comando.

Você precisa de um ponto e vírgula (; ) no final de cada instrução em plpgsql (exceto para o END final ).

Você precisa de END IF; no final do IF demonstração.

Uma sub-seleção deve estar entre parênteses:
    IF (SELECT count(*) FROM orders) > 0 ...

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

Isso é equivalente e muito mais rápido, no entanto:
    IF EXISTS (SELECT FROM orders) ...

Alternativa


O SELECT adicional Não é necessário. Isso faz o mesmo, mais rápido:
DO
$do$
BEGIN
   DELETE FROM orders;
   IF NOT FOUND THEN
      INSERT INTO orders VALUES (1,2,3);
   END IF;
END
$do$

Embora improvável, transações simultâneas gravadas na mesma tabela podem interferir. Para ter certeza absoluta, bloqueie a tabela na mesma transação antes de continuar conforme demonstrado.