2010-11-16 5 views
7

Pourriez-vous dire à mon pourquoi le isnt suivant travailler dans Postgres sql ?:Postgres imbriquées si dans le cas requête

See updated code below 

MISE À JOUR:

j'attends la requête pour revenir « 0,30 » comme flotteur. Cette construction est uniquement à des fins de test, j'ai quelques querys complexes qui dépendent de cette structure conditionnelle ... mais je ne sais pas comment le résoudre ..

résultat est:

ERROR: syntax error at or near "1" 
LINE 4:  if 1=1 then 

MISE À JOUR:

Cette construction apparaît dans une fonction ... donc je veux faire ce qui suit:

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$ 
    BEGIN 
    select (
     case (select '1') 
     when '1' then 
     if 1=1 then 
      0.30::float 
     else 
      0.50::float 
     end 
     else 
     1.00::float 
     end 
    ); 
    END; 
$$ LANGUAGE plpgsql; 

select f_test(1) as test; 

Message d'erreur voir ci-dessus.

+0

utilisez un langage approprié, inutile d'utiliser quoi que ce soit au-delà de pg ici. – Woot4Moo

+0

définir "ne fonctionne pas". Qu'espériez-vous arriver et qu'est-ce qui s'est réellement passé? – Hamish

+0

Quelle est la sortie réelle que vous attendez? – Woot4Moo

Répondre

9

Il n'existe pas de syntaxe IF expr THEN result ELSE result END pour les requêtes SQL normales dans Postgres. Comme il n'y a ni une fonction IF() comme dans MySQL, vous devez utiliser CASE:

select (
    case (select '1') 
    when '1' then 
    case when 1=1 then 0.30::float else 0.50::float end 
    else 
    1.00::float 
    end 
); 
+0

Oui, voir http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html – Lichtamberg

+0

Non non, c'est pour les procédures stockées. Pour eux, il y en a un aussi dans MySQL, mais * pas * pour du SQL normal. – AndreKR

+0

J'ai mis à jour mon post, j'utilise ce code dans une fonction ... donc ça devrait marcher? – Lichtamberg

1

Je ne sais pas ce que vous essayez d'atteindre avec cette fonction, mais voici une version de travail.

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$ 
BEGIN 
    IF myvalue = 1 THEN 
      IF 1=1 THEN 
        RETURN 0.30::FLOAT; 
      ELSE 
        RETURN 0.50::FLOAT; 
      END IF; 
    ELSE 
      RETURN 1.0::FLOAT; 
    END IF; 
END; 

La fonction retourne 0,3 si la valeur d'entrée est 1, sinon il retournera 1. Edit: Notez que 0,5 est jamais retournée par la fonction.

+0

C'est seulement une fonction de test sans sens .. Mais j'ai des requêtes complexes qui dépendent de cette structure conditionnelle .. Je vais essayer votre réponse ... THanks – Lichtamberg

Questions connexes