2010-11-16 34 views
7

Podría decirle a mi por qué el siguiente isnt trabajando en Postgres SQL ?:Postgres anidados si en caso de consulta

See updated code below 

ACTUALIZACIÓN:

espero que devuelva la consulta "0,30", como flotador. Esta construcción es sólo para propósitos de prueba, tengo algunas querys complejos que dependen de esta estructura condicional ... pero no sé cómo solucionarlo ..

resultado es:

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

ACTUALIZACIÓN:

Esta construcción presenta en una función ... así que quiero hacer lo siguiente:

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; 

mensaje de error véase más arriba.

+0

utilice el lenguaje apropiado, no necesita usar nada más allá de la página p aquí. – Woot4Moo

+0

define "no funciona". ¿Qué esperabas que sucediera y qué sucedió realmente? – Hamish

+0

¿Cuál es el resultado real que está esperando? – Woot4Moo

Respuesta

9

No hay sintaxis IF expr THEN result ELSE result END para las consultas SQL normales en Postgres. Como no hay ni una función IF() como en MySQL, usted tiene que utilizar 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

Sí, consulte http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html – Lichtamberg

+0

No, eso es para procedimientos almacenados. Para ellos hay uno en MySQL, también, pero * no * para SQL normal. – AndreKR

+0

He actualizado mi publicación, uso este código en una función ... ¿así que debería funcionar? – Lichtamberg

1

no sé lo que estás tratando de lograr con esta función, pero esto es una versión de trabajo.

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 función devuelve 0.3 si el valor de entrada es 1, de lo contrario volverá 1. Editar: Tenga en cuenta que 0,5 no es devuelto por la función.

+0

Es solo una función de prueba sin sentido ... Pero tengo consultas complejas que dependen de esta estructura condicional ... Probaré tu respuesta ... THanks – Lichtamberg

Cuestiones relacionadas