Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Query > Elenchi di selezione
PrecedenteExpressioni di tabellaQuery di combinazioneSuccessivo

7.3. Elenchi di selezione

Come visto nella sezione precedente, l'espressione di tabella nel comando SELECT costruisce una tabella virtuale intermedia combinando possibilmente tabelle, viste, eliminando righe, raggruppamenti, ecc. Questa tabella viene infine passata all'elaborazione dall'elenco di selezione. L'elenco di selezione determina quali colonne della tabella intermedia sono mostrate in output.

7.3.1. Elementi dell'elenco di selezion

Il tipo più semplice di elenco di selezione è * che rappresenta tutte le colonne che l'espressione di tabella produce. Altrimenti, un elenco di selezione è un elenco separato da virgole di valori (come definito in Sezione 4.2, «Espressioni di valore»). Per esempio, potrebbe essere un elenco di nomi di colonna:

SELECT a, b, c FROM ...

I nomi di colonna a, b, e c sono o i nomi attuali delle colonne delle tabelle referenziate nella clausola FROM o gli alias a loro forniti, come spiegato in Sezione 7.2.1.2, «Alias di tabella e colonna». Il namespace disponibile nell'elenco di selezione è lo stesso che nella clausola WHERE, a meno che sia usato il raggruppamento, nel qual caso è lo stesso che nella clausola HAVING.

Se più di una tabella ha una colonna con lo stesso nome, deve essere specificato anche il nome della tabella, quindi:

SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

Quando si lavora con molteplici tabelle, può anche essere utile usarlo per tutte le colonne di una tabella:

SELECT tbl1.*, tbl2.a FROM ...

(Si veda inoltre Sezione 7.2.2, «La clausola WHERE»).

Se un valore arbitrario vien usato nell'elenco di selezione, esso concettualmente aggiunge una nuova colonna virtuale alla tabella restituita. Il valore è valutato una volta per ogni riga del risultato, con i valori della riga sostituiti per ogni riferimento di colonna. Le espressioni nell'elenco di selezione non devono fare riferimento a qualsiasi colonna nell'espressione di tabella della clausola FROM; questi possono essere espressioni di costanti aritmetiche, per esempio.

7.3.2. Etichette di colonna

Le voci dell'elenco di selezione possono essere assegnate per elaborazioni successive, come per l'uso in una clausola ORDER BY o per essere visualizzati dall'applicazione client. Per esempio:

SELECT a AS value, b + c AS sum FROM ...

Se non viene specificato un nome di colonna di output usando AS, il sistema assegna unome di colonna predefinito. Per riferimenti di solonna semplici, questo sarà il nome della colonna a cui si fà riferimento. Per chiamate di funzione, sarà il nome della funzione. Per espressioni complesse, il sistema genererà un nome generico.

La parola chiave AS è opzionale, ma solo se il nome della nuova colonna non corrisponde a nessuna parola chiave di PostgreSQL™ (si veda Appendice C, Parole chiave SQL). Per evitare una corrispondenza accidentale con una parola chiave, è possibile mettere il nome della colonna tra doppi apici. Per esempio, VALUE è una parola chiave, quindi questo non funzionerà:

SELECT a value, b + c AS sum FROM ...

ma questo si:

SELECT a "value", b + c AS sum FROM ...

Per protezione rispetto a possibili future aggiunte di parole chiave, si raccomanda di scrivere sempre o AS o mettere tra doppi apici il nome della colonna.

[Nota]

Nota

La nomenclature delle colonne di output è diversa da quella della clausola FROM (si veda Sezione 7.2.1.2, «Alias di tabella e colonna»). È possibile rinominare la stessa colonna due volte, ma il nome assegnato nell'elenco di selezione è quello che verrà passato.

7.3.3. DISTINCT

Dopo che l'elenco di selezione è stato elaborato, la tabella risultante puà essere opzionalmente soggetta a eliminazione di righe duplicate. Per specificare questo, la parola chiave DISTINCT viene scritta direttamente dopo SELECT:

SELECT DISTINCT select_list ...

(Invece di DISTINCT, la parola chiave ALL può essere usata per specificare il comportamento predefinito di restituire tutte le righe).

Ovviamente, due righe sono considerate distinte se differiscono in almeno un valore di colonna. Valori null sono considerati uguali in questo confronto.

Alternativamente, un'espressione arcbitraria può determinare quali righe devono essere consiferate distinte:

SELECT DISTINCT ON (expression [, expression ...]) select_list ...

Qui expression è un valore arbitrario che viene valutato per tutte le righe. Un insieme di righe per il quale tutte le espressioni sono uguali sono considerate duplicate, e solo la prima riga dell'insieme è mantenuta in output. Notare che la «prima riga» di un insieme è imprevedibile a meno che la query non sia ordinata rispetto ad abbastanza colonne da garantire un ordinamento unico delle righe in arrivo al filtro DISTINCT. (L'elaborazione di DISTINCT ON avviene dopo l'ordinamento ORDER BY).

La clausola DISTINCT ON non fa parte dello standard SQL e qualche volta è considerata cattivo stile data la natura potenzialmente indeterminata dei suoi risultati. Con un uso giudizioso di GROUP BY e sottoquery nella FROM, questo costrutto può essere evitato, ma spesso è l'alternativa più conveniente.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Query > Elenchi di selezione
PrecedenteExpressioni di tabellaQuery di combinazioneSuccessivo