10
votes

PostgreSQL Si-ALORS-STRUCTURE DE CONTRÔLE

Pourquoi est-ce que je reçois toujours l'erreur suivante à partir de postgres?

Erreur de syntaxe à ou près de "si"

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

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


0 commentaires

3 Réponses :


5
votes

Vous n'interferez pas la structure de contrôle PL / PGSQL dans un anonyme Bloquer ou une fonction PL / PGSQL.

pour la version SQL de cette structure de contrôle, voir les docs pour cas .


1 commentaires

Le cas ne peut pas être utilisé au niveau supérieur, cependant, uniquement dans le cadre d'une requête SQL. En d'autres termes, il ne peut pas être utilisé pour diriger le comportement qui ne fait pas partie d'une autre requête déjà, ce que la question initiale semblait vouloir.



18
votes
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;

2 commentaires

Oh, merci pour votre réponse aussi. Non, je cherchais juste comment faire l'une ou l'autre "Sélectionner" en fonction de la condition "si". Donc, comme je l'ai trouvé qu'il n'y a aucun moyen de le faire en simples comme celui-ci si (Sélectionnez ...) = 2 puis sélectionnez ... sinon choisir ... fin si;


En fait si (sélectionnez A de t) = 2 puis null; FIN SI; Travaillerait, le problème est probablement que vous essayez de choisir quelque chose dans un contexte, cela ne renvoie rien. Dans ce cas, Pavel a fait un exemple parfait. Vous pouvez utiliser Renvoi Query en prise en compte, que vous avez défini votre fonction correctement.



1
votes

Vous n'intégrez pas que pl / pgsql. Ils doivent être enfermés avec Bloc de code anonyme . Exemple pour votre code:

DO $$ BEGIN

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

END$$;


0 commentaires