Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Funzioni e Operatori > Espressioni sottoquery
PrecedenteFunzioni windowConfronti di array e righeSuccessivo

9.20. Espressioni sottoquery

Questa sezione descrive le espressioni sottoquery conformi-SQL disponibili in PostgreSQL™. Tutte le forme delle espressioni documentate in questa sezione restituiscono risultati booleani (true/false).

9.20.1. EXISTS

EXISTS (subquery)

L'argomento di EXISTS è una arbitraria istruzione SELECT o una sottoquery. La sottoquery viene valutata per determinare se essa restituisce qualche riga. Se restituisce almeno una riga, il risultato di EXISTS è «true»; se la sottoquery non restituisce righe, il risultato di EXISTS è «false».

La sottoquery può fare riferimento alle variabili della query circostante, che fungeranno da costanti durante qualsiasi valutazione della sottoquery.

La sottoquery viene generalmente eseguita solo quanto basta per determinare se viene restituita almeno una riga, non fino al suo completamento. È sconsigliabile scrivere una sottoquery che ha effetti secondari (come chiamare funzioni di sequenza); se si verificano effetti secondari o no potrebbe essere difficile da prevedere.

Dato che il risultato dipende solo dalle presenza o no di qualche riga restituita, e non dal contenuto di queste righe, l'elenco di output della sottoquery non è normalmente interessante. Una convenzione di codifica comune è di scrivere i controlli EXISTS nella forma EXISTS(SELECT 1 WHERE ...). Tuttavia ci sono eccezioni a questa regola, tipo le sottoquery che usano INTERSECT.

Questo semplice esempio è simile ad un inner join sulla col2, ma esso produce al massimo una riga d'uscita per ogni riga di tab1, anche se ci sono corrispondenze multiple con le righe di tab2:

SELECT col1
FROM tab1
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

9.20.2. IN

expression IN (subquery)

La parte a destra è una sottoquery tra parentesi, che deve restituire esattamente una colonna. L'espressione a sinistra viene valutata e confrontata con ogni riga del risultato della sottoquery. Il risultato di IN è «true» se qualche riga uguale viene trovata nella sottoquery. Il risultato è «false» se non viene trovata nessuna riga uguale (compreso il caso speciale in cui la sottoquery non restituisca nessuna riga).

Notare che se l'espressione a sinistra produce null, o se ci sono valori a destra non uguali e almeno una riga a destra produce null, il risultato del costrutto IN sarà null, non false. Questo è in accordo alle normali regole SQL per le combinazioni booleane dei valori null.

Come con EXISTS, è sconsigliabile presumere che la sottoquery sarà valutata completamente.

row_constructor IN (subquery)

La parte sinistra di questa forma di IN è un costruttore di riga, come descritto in Sezione 4.2.12, «Costruttori di riga». La parte destra è una sottoquery tra parentesi, che deve restituire esattamente tante colonne per quante ce ne sono nella riga contenuta nell'espressione della parte sinistra. L'espressione della parte sinistra viene valutata e confrontata con ogni riga risultante dalla sottoquery. Il risultato di IN è «true» se qualche riga uguale viene trovata nella sottoquery. Il risultato è «false» se nessuna riga uguale viene trovata (compreso il caso speciale dove la sottoquery non restituisca nessuna riga).

Come al solito, i valori null nelle righe vengono combinati con le normali regole delle espressioni SQL booleane. Due righe sono considerate uquali se tutti i loro corrispondenti membri sono non-null e uguali; le righe sono non uguali se uno qualsiasi dei corrispondenti membri è non-null e non uguale; altrimenti il risultato di quel confronto di riga è sconosciuto (null). Se tutti i risultati per riga sono o non uguali oppure null, con almeno un null, allora il risultato di IN è null.

9.20.3. NOT IN

espressione NOT IN (subquery)

La parte destra è una sottoquery tra parentesi, che restituisce esattamente una colonna. L'espressione della parte sinistra viene valutata e confrontata ad ogni riga del risultato della sottoquery. Il risultato di NOT IN è «true» se solo righe non uguali sono trovate nella sottoquery (compreso il caso speciale in cui la sottoquery non restituisce nessuna riga). Il risultato è «false» se viene trovata qualche riga uguale.

Notare che se l'espressione della parte sinistra rende null, o se non ci sono valori uguali nella parte destra e almeno una riga della parte destra rende null, il risultato del costrutto NOT IN sarà null, non true. Questo è conforme con le normali regole SQL per le combinazioni booleane di valori null.

Come con EXISTS, è sconsigliabile presumere che la sottoquery sarà valutata completamente.

row_constructor NOT IN (subquery)

La parte sinistra di questa forma di NOT IN è un costruttore di riga, come descritto in Sezione 4.2.12, «Costruttori di riga». La parte destra è una sottoquery tra parenthesi che deve restituire esattamente tante colonne per quante ce ne sono nella riga contenuta nell'espressione della parte sinistra. L'espressione nella parte sinistra viene valutata e confrontata row-wise con ogni riga risultante dalla sottoquery. Il risultato di NOT IN è «true» se solo righe non uguali vengono trovate nella sottoquery (compreso il caso speciale in cui la sottoquery non restituisce nessuna riga). Il risultato è «false» se viene trovata qualche riga uguale.

Come al solito, i valori null nelle righe vengono combinati con le normali regole SQL per le espressioni booleane. Due righe sono considerate uquali se tutti i loro corrispondenti membri sono non-null e uguali; le righe sono non uguali se uno qualsiasi dei corrispondenti membri è non-null e non uguale; altrimenti il risultato di quel confronto di riga è sconosciuto (null). Se tutti i risultati per riga sono o non uguali oppure null, con almeno un null, allora il risultato di NOT IN è null.

9.20.4. ANY/SOME

expression operator ANY (subquery)
expression operator SOME (subquery)

La parte destra è una sottoquery tra parentesi, che deve restituire esattamente una colonna. L'espressione della parte sinistra viene valutata e confrontata con ogni riga risultante della sottoquery usando l'operator fornito, che dovrà rendere un risultato booleano. Il risultato di ANY è «true» se è ottenuto un risultato vero. Il risultato è «false» se non è stato trovato un risultato vero (compreso il caso speciale in cui la sottoquery non restituisca nessuna riga).

SOME è un sinonimo per ANY. IN è equivalente a = ANY.

Notare che se non ci sono successi ed almeno una riga della parte destra rende null come risultato dell'operatore, il risultato del costrutto ANY sarà null, non falso. Questo è conforme con le normali regole SQL per le combinazioni booleane di valori null.

Come con EXISTS, è sconsigliabile presumere che la sottoquery sarà valutata completamente.

row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)

La parte sinistra di questa forma di ANY è un costruttore di riga, come descritto in Sezione 4.2.12, «Costruttori di riga». La parte destra è una sottoquery tra parentesi che deve restituire esattamente tante colonne per quante ce ne sono nella riga contenuta nell'espressione della parte sinistra. L'espressione nella parte sinistra viene valutata e confrontata "row-wise" con ogni riga risultante dalla sottoquery, usando l'operatore fornito. Il risultato di ANY è «true» se il confronto restituisce true per qualsiasi riga della sottoquery. Il risultato è «false» se il confronto restituisce false per ogni riga della sottoquery (compreso il caso speciale in cui la sottoquery non restituisce nessuna riga). IL risultato è NULL se il confronto non restituisce true per ogni riga, e restituisce NULL per almeno una riga.

Vedere Sezione 9.21.5, «Confronto Row-wise» per dettagli sul significato di confronto "row-wise".

9.20.5. ALL

expression operator ALL (subquery)

La parte destra è una sottoquery tra parentesi, che deve restituire esattamente una colonna. L'espressione della parte sinistra viene valutata e confrontata con ogni riga risultante della sottoquery usando l'operatore fornito, che dovrà rendere un risultato booleano. Il risultato di ALL è «true» se tutte le righe rendono true (compreso il caso speciale in cui la sottoquery non restituisca nessuna riga). Il risultato è «false» se viene trovato qualche risultato false. Il risultato è NULL se il confronto non restituisce false per ogni riga, e restituisce NULL per almeno una riga.

NOT IN è equivalente a <> ALL.

Come con EXISTS, sconsigliabile presumere che la sottoquery sarà valutata completamente.

    row_constructor 
    operator 
    ALL (subquery)

Il lato sinistro di questa forma di ALL è un costruttore di riga, come descritto in Sezione 4.2.12, «Costruttori di riga». Il lato destro è una sottoquery tra parentesi, che deve restituire esattamente tante colonne quante espressioni ci sono nella riga sulla sinistra. Le espressioni sulla sinistra sono valutate e confrontate in modo row-wise ad ogni riga del risultato della sottoquery, usando l'operatore dato. Il risultato di ALL è «true» se il confronto restituisce true per tutte le righe della sottoquery (incluso il caso in cui la sottoquery non restituisce righe). Il risultato è «false» se il confronto ritorna false per ogni riga della sottoquery. Il risultato è NULL se il confronto non restituisce false per ogni riga della sottoquey, e ritorna NULL per almeno una riga.

vedere Sezione 9.21.5, «Confronto Row-wise» per dettagli sul significato di un confronto row-wise.

9.20.6. Confronto row-wise

    row_constructor 
    operator (subquery)

Il lato sinistro è un costruttore di riga, come descritto in Sezione 4.2.12, «Costruttori di riga». Il lato destro è una sottoquery tra parentesi, che restituisce esattamente quante colonne quante espressioni ci sono nella riga sulla sinistra. Inoltre, la sottoquery non può ritornare più di una riga. (Se restituisce zero righe, il risultato è considerato essere null). Il lato sinistro è valutato e confrontato in modo row-wise alla singola riga risultante dalla sottoquery.

Vedere Sezione 9.21.5, «Confronto Row-wise» per dettagli sul significato di un confronto "row-wise".

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Funzioni e Operatori > Espressioni sottoquery
PrecedenteFunzioni windowConfronti di array e righeSuccessivo