4.3. 選択リスト

前節で示したように、SELECTコマンド中のテーブル式は、テーブルの結合やビュー、行の抽出、グループ化などにより中間の仮想テーブルを作ります。 このテーブルは最終的に選択リストに渡されます。選択リストは、中間のテーブルのどのが実際に出力されるかを決めます。

4.3.1. 選択リスト項目

テーブル式が生成するすべての列を出力する*が最も簡単な選択リストです。そうでなければ、選択リストは、カンマで区切られた評価式(Section 1.2参照)のリストです。たとえば、以下のような列名のリストであってもかまいません。

SELECT a, b, c FROM ...

abc という列名は、FROM 句で参照されるテーブルの実際の列名か、あるいは、Section 4.2.1.2 で説明したような別名です。 グルーピングされていなければ、選択リストで使える名前空間は WHERE 句と同じです (グルーピングされている場合は、HAVING 句と同じとなります)。

もし、2つ以上のテーブルで同じ名前の列がある場合は、次のように、テーブル名を必ず指定しなければいけません

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

Section 4.2.2 も参照)。

任意の評価式が選択リストで使われる場合、返されるテーブルは、概念的には新たに仮想的な列を追加したものとなります。評価式は、それぞれの行で、行の値を列の参照とみなして一旦評価されます。 しかし選択リストの式は、FROM 句で指定されたテーブルの列を参照するものである必要はありません。 たとえば、それらは定数算術式でもかまいません。

4.3.2. 列ラベル

選択リスト中のエントリは後の処理のために名前を割り当てることができます。この場合の"後の処理"とは、オプションのソート指定やクライアントアプリケーションのことです(たとえば、列へッダを表示するために使います)。例を示します。

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

もし、ASを使った列名の指定が無かった場合、システムは、デフォルトの名前を割り当てます。単純な列の参照では、参照された列名となります。関数呼び出しでは、関数名となります。 複雑な表現については、システムが汎用の名前を生成します。

Note: ここでの出力列の名前は、FROM 句 (Section 4.2.1.2を参照) で示したものとは異なります。パイプ処理で、同じ列を2度改名することが可能ですが、選択リストの中で選ばれた名前が渡されます。

4.3.3. DISTINCT

選択リストが処理された後、結果テーブルの重複データを削除の対象にすることもできます。 これを行うには、SELECT の直後に DISTINCT キーワードを指定します。

SELECT DISTINCT select_list ...

(DISTINCT の代わりに ALL を指定すると、すべての行がデフォルトで保持されます。)

少なくとも1つの列の値が異なる場合、それら2行は別個とみなされます。 NULL 値は、この比較において等しいとみなされます。

また、任意の式を使用して、どの行が別であるかを決定することもできます。

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

expressionは、すべての行で評価されるの任意の評価式です。全ての式が等しくなる行の集合は、重複しているとみなされ、集合の最初の行だけが出力されます。 DISTINCT フィルタにかけられる行の順序を一意にするのに十分な列数に基づいて問い合わせがソートされない限り、出力される集合の"最初の行" は予想不可能であることに注意してください。 ((DISTINCT ON 処理は、ORDER BY によるソートの後に行われます。)

DISTINCT ON 句は、SQL 標準ではありません。さらに、結果が不定となる可能性があるため、場合によっては好ましくないスタイルとなります。 GROUP BYFROM 中の副問い合わせをうまく使うことによりにこの構成を回避できます。しかし、DISTINCT ON 句は多くの場合非常に便利な代案となります。