PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

SQL dinamico (EXECUTE) come condizione per l'istruzione IF

Questo costrutto non è possibile:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...

Puoi semplificare in:

IF EXISTS (SELECT 1 FROM mytable) THEN ...

Ma il tuo esempio è probabilmente semplificato. Per SQL dinamico eseguito con EXECUTE , leggi il manuale qui. Puoi controllare la variabile speciale FOUND immediatamente dopo l'esecuzione di qualsiasi comando DML per vedere se le righe qui presenti sono interessate:

IF FOUND THEN ...

Tuttavia:

Nota in particolare che EXECUTE cambia l'output di GET DIAGNOSTICS , ma non cambia FOUND .

Enfasi in grassetto mio. Per un semplice EXECUTE fai questo invece:

...
DECLARE
   i int;
BEGIN
   EXECUTE 'SELECT 1 FROM mytable';  -- something dynamic here

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

Oppure se opportuno, in particolare con risultati a riga singola, utilizzare il INTO clausola con EXECUTE per ottenere direttamente un risultato dalla query dinamica. Cito il manuale qui:

Se viene fornita una riga o un elenco di variabili, deve corrispondere esattamente alla struttura dei risultati della query (quando viene utilizzata una variabile di record, si configurerà automaticamente per corrispondere alla struttura dei risultati). Se vengono restituite più righe, solo la prima verrà assegnata a INTO variabile. Se non vengono restituite righe, NULL viene assegnato a INTO variabile/i.

...
DECLARE
   _var1 int;  -- init value is NULL unless instructed otherwise
BEGIN

EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO    _var1;

IF _var1 IS NOT NULL THEN ...