web-dev-qa-db-fra.com

Structure de contrôle PostgreSQL IF-THEN-ELSE

Pourquoi ai-je toujours l'erreur suivante de Postgres?

syntax error at or near "IF"

J'ai lu PostgreSQL: Documentation: 8.3: Structures de contrôle . J'ai d'abord essayé d'exécuter une requête difficile (avec une sous-requête), mais ensuite j'ai essayé d'exécuter une requête simple comme celle-ci:

IF 2 <> 0 THEN select * from users; END IF;

L'erreur est toujours la même. Qu'est-ce que je fais mal?

10
Elkan
IF 2 <> 0 THEN select * from users; END IF;

Vous ne pouvez pas utiliser d'instructions PL/pgSQL en dehors des fonctions de plpgsql. Et si ce fragment provient de la fonction plpgsql, alors c'est aussi un non-sens. Vous ne pouvez pas retourner directement le résultat d'une requête comme le fait T-SQL. 

CREATE OR REPLACE FUNCTION test(p int)
RETURNS SETOF users AS $$
BEGIN
  IF p = 1 THEN
    RETURN QUERY SELECT * FROM users;
  END IF;
  RETURN;
END;
$$ LANGUAGE plpgsql;

Lorsque vous obtenez un résultat de fonction, vous devez utiliser l'instruction RETURN - plpgsql ne connait que la fonction, il ne prend pas en charge les procédures - donc, SELECT non lié n'a pas de sens.

18
Pavel Stehule

Vous n'incluez pas cette structure de contrôle PL/pgSQL dans un bloc anonyme ou une fonction PL/pgSQL.

Pour la version SQL de cette structure de contrôle, voir la documentation de CASE .

4
Milen A. Radev

Vous n'incluez pas ce PL/pgSQL. Ils doivent être entourés de bloc de code anonyme . Exemple pour votre code:

DO $$ BEGIN

    IF 2 <> 0 THEN select * from users; END IF;

END$$;
1
user