Instruction IF de PostgreSQL

Comment puis-je effectuer une telle requête dans Postgres?

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

Essayer:

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

Points majeurs

  • Il n’y a pas d’éléments procéduraux en SQL standard. L’ instruction IF fait partie du langage procédural par défaut PL / pgSQL. Vous devez créer une fonction ou exécuter une instruction ad hoc avec la commande DO .

  • Vous avez besoin d’un à la fin de chaque instruction dans plpgsql ( sauf pour la finale END ).

  • Vous avez besoin de END IF; à la fin de l’instruction IF .

  • Une sous-sélection doit être entourée de parenthèses:

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

    Ou:

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

    Ceci est équivalent et beaucoup plus rapide cependant:

     IF EXISTS (SELECT 1 FROM orders) ... 

Alternative

Vous n’avez pas besoin d’un SELECT supplémentaire du tout ici. Cela fait la même chose, un peu plus vite:

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

Juste pour aider si quelqu’un tombe sur cette question comme moi, si vous voulez utiliser si dans PostgreSQL, vous utilisez “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 

De la documentation

 IF boolean-expression THEN statements ELSE statements END IF; 

Donc, dans votre exemple ci-dessus, le code devrait ressembler à ceci:

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

Vous étiez manquant: FIN SI;

Vous pouvez également utiliser la structure de base pour le CAS PL / pgSQL avec un bloc de procédure de bloc de code anonyme :

 DO $$ BEGIN CASE WHEN boolean-expression THEN statements; WHEN boolean-expression THEN statements; ... ELSE statements; END CASE; END $$; 

Les références:

  1. http://www.postgresql.org/docs/current/static/sql-do.html
  2. https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html