2012-04-04 45 views

Respuesta

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

No se pueden usar sentencias PL/pgSQL fuera de las funciones plpgsql. Y si este fragmento es de la función plpgsql, entonces tampoco tiene sentido. No puede devolver directamente el resultado de la consulta, como lo hace 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; 

Cuando se podrían obtener algún resultado de la función, usted tiene que utilizar sentencia RETURN - plpgsql sólo conoce la función, no es compatible con los procedimientos - por lo que no acotada SELECT no ha sentido.

+0

Ah, gracias por su respuesta también. No, solo estaba buscando cómo hacer que uno u otro "seleccione" según la condición en "SI". Entonces, como encontré, no hay forma de hacerlo en un modo simple como este IF (SELECT ...) = 2 THEN SELECT ... ELSE SELECT ... END IF; – Elkan

+0

En realidad IF (seleccione a de t) = 2 THEN NULL; END IF; funcionaría, el problema es probablemente que estás tratando de SELECCIONAR algo en un contexto, que no devuelve nada. En este caso, Pavel fue un ejemplo perfecto. Puede usar 'RETURN QUERY' teniendo en cuenta que definió su función correctamente. – valgog

4

No está encerrando esa estructura de control PL/pgSQL en una función anonymous block o PL/pgSQL.

Para la versión SQL de esta estructura de control, vea los documentos para CASE.

+0

Hm ... gracias mucho) – Elkan

+0

caso, no se puede utilizar en el nivel superior, sin embargo, sólo como parte de una consulta SQL. En otras palabras, no se puede usar para dirigir el comportamiento que ya no forma parte de otra consulta, que es lo que parecía querer la pregunta original. – BlueBomber

0

No está encerrando ese PL/pgSQL. Necesitan estar encerrados con anonymous code block. Ejemplo de su código:

DO $$ BEGIN 

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

END$$; 
Cuestiones relacionadas