2012-04-04 2 views

risposta

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

Non è possibile utilizzare istruzioni PL/pgSQL al di fuori delle funzioni di plpgsql. E se questo frammento proviene dalla funzione plpgsql, anche questo non ha senso. Non è possibile restituire direttamente il risultato di una query come fa 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; 

Quando volete ottenere qualche risultato da funzioni, è necessario utilizzare istruzione RETURN - plpgsql conosce solo la funzione, non supporta le procedure - così sconfinata SELECT non ha senso.

+0

Oh, grazie anche per la tua risposta. No, stavo solo cercando su come fare uno o l'altro "selezionare" a seconda delle condizioni in "IF". Quindi, come ho trovato, non c'è modo di farlo in un modo semplice come questo IF (SELECT ...) = 2 THEN SELECT ... ELSE SELECT ... END IF; – Elkan

+0

In realtà IF (selezionare a da t) = 2 THEN NULL; FINE IF; funzionerebbe, il problema è probabilmente che stai provando a selezionare qualcosa in un contesto, che non restituisce nulla. In questo caso Pavel ha fatto un esempio perfetto. Puoi usare 'RETURN QUERY' tenendo conto che hai definito correttamente la tua funzione. – valgog

4

Non si sta allegando la struttura di controllo PL/pgSQL in una funzione anonymous block o PL/pgSQL.

Per la versione SQL di questa struttura di controllo, consultare la documentazione per CASE.

+0

Hm ... grazie mille) – Elkan

+0

caso non può essere utilizzato a livello superiore, però, solo come parte di una query SQL. In altre parole, non può essere utilizzato per dirigere un comportamento che non fa già parte di un'altra query, che è ciò che la domanda originale sembrava volere. – BlueBomber

0

Non stai includendo quel PL/pgSQL. Devono essere allegati a anonymous code block. Esempio per il codice:

DO $$ BEGIN 

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

END$$;