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);
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$
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) ...
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é.
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 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;
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: