web-dev-qa-db-fra.com

Instruction PostgreSQL Si

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

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

Essayer:

DO
$do$
BEGIN
IF EXISTS (SELECT 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 de procédure dans le 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 .

  • Tu as besoin d'un ; à la fin de chaque instruction dans plpgsql ( sauf pour la dernière END ).

  • Vous avez besoin 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) ...
    

    C'est équivalent et beaucoup plus rapide, cependant:

    IF EXISTS (SELECT FROM orders) ...
    

Alternative

Vous n'avez pas besoin de 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$

Bien que peu probable, une transaction simultanée essayant d'écrire dans la même table peut interférer. Pour être absolument sûr, write-lock la table dans la même transaction avant de procéder comme indiqué.

105
Erwin Brandstetter

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
24
Mahmood

De la docs

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 manquiez: END IF;

8
Woot4Moo

Vous pouvez également utiliser la structure de base de CAS/PLgSQL avec bloc de code anonyme bloc de procédures:

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

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
5
user