バージョンごとのドキュメント一覧

7.3. 選択リスト #

<title>Select Lists</title>

As shown in the previous section, the table expression in the <command>SELECT</command> command constructs an intermediate virtual table by possibly combining tables, views, eliminating rows, grouping, etc. This table is finally passed on to processing by the <firstterm>select list</firstterm>. The select list determines which <emphasis>columns</emphasis> of the intermediate table are actually output. 前節で示したように、SELECTコマンド中のテーブル式は、テーブルやビューの結合、行の抽出、グループ化などにより中間の仮想テーブルを作ります。 このテーブルは最終的に選択リストによる処理に渡されます。 選択リストは、中間のテーブルのどのを実際に出力するかを決めます。

7.3.1. 選択リスト項目 #

<title>Select-List Items</title>

The simplest kind of select list is <literal>*</literal> which emits all columns that the table expression produces. Otherwise, a select list is a comma-separated list of value expressions (as defined in <xref linkend="sql-expressions"/>). For instance, it could be a list of column names: テーブル式が生成するすべての列を出力する*が最も簡単な選択リストです。 そうでなければ、選択リストは、カンマで区切られた(4.2で定義された)評価式のリストです。 例えば、以下のような列名のリストであっても構いません。

SELECT a, b, c FROM ...

The columns names <literal>a</literal>, <literal>b</literal>, and <literal>c</literal> are either the actual names of the columns of tables referenced in the <literal>FROM</literal> clause, or the aliases given to them as explained in <xref linkend="queries-table-aliases"/>. The name space available in the select list is the same as in the <literal>WHERE</literal> clause, unless grouping is used, in which case it is the same as in the <literal>HAVING</literal> clause. abcという列名は、FROM句で参照されるテーブルの実際の列名か、あるいは7.2.1.2で説明したような列名に対する別名です。 グループ化されていなければ、選択リストで使用可能な名前空間はWHERE句と同じです。 グループ化されている場合は、HAVING句と同じとなります。

If more than one table has a column of the same name, the table name must also be given, as in: もし、2つ以上のテーブルで同じ名前の列がある場合は、次のように、テーブル名を必ず指定しなければいけません。

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

When working with multiple tables, it can also be useful to ask for all the columns of a particular table: 複数のテーブルを使用する場合、特定のテーブルのすべての列を求める方法も便利かもしれません。

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

See <xref linkend="rowtypes-usage"/> for more about the <replaceable>table_name</replaceable><literal>.*</literal> notation. table_name.*という指定方法の詳細については、8.16.5を参照してください。

If an arbitrary value expression is used in the select list, it conceptually adds a new virtual column to the returned table. The value expression is evaluated once for each result row, with the row's values substituted for any column references. But the expressions in the select list do not have to reference any columns in the table expression of the <literal>FROM</literal> clause; they can be constant arithmetic expressions, for instance. 任意の評価式が選択リストで使われる場合、返されるテーブルは、概念的には新たに仮想的な列を追加したものとなります。 評価式は、それぞれの結果行で、その列参照を置換した行の値としていったん評価されます。 しかし、選択リストの式はFROM句で指定されたテーブル式内の列を参照するものである必要はありません。例えば、定数算術式であっても構いません。

7.3.2. 列ラベル #

<title>Column Labels</title>

The entries in the select list can be assigned names for subsequent processing, such as for use in an <literal>ORDER BY</literal> clause or for display by the client application. For example: 選択リスト中の項目は、ORDER BY句の中での参照、もしくはクライアントアプリケーションによる表示での使用など、それに続く処理のために名前を付与できます。 例を示します。

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

If no output column name is specified using <literal>AS</literal>, the system assigns a default column name. For simple column references, this is the name of the referenced column. For function calls, this is the name of the function. For complex expressions, the system will generate a generic name. ASを使った出力列名の指定がない場合、システムはデフォルトの列名を付与します。 単純な列参照では参照された列名となります。 関数呼び出しでは関数名となります。 複雑な表現についてはシステムが汎用の名前を生成します。

The <literal>AS</literal> key word is usually optional, but in some cases where the desired column name matches a <productname>PostgreSQL</productname> key word, you must write <literal>AS</literal> or double-quote the column name in order to avoid ambiguity. (<xref linkend="sql-keywords-appendix"/> shows which key words require <literal>AS</literal> to be used as a column label.) For example, <literal>FROM</literal> is one such key word, so this does not work: ASキーワードは通常省略できますが、必要な列名がPostgreSQLキーワードと一致する場合は、あいまいさを避けるためにASと記述するか、列名を二重引用符で括る必要があります。 (付録Cは、列ラベルとしてASを使用する必要があるキーワードを示しています。) 例えば、FROMはそのようなキーワードの1つなので、以下は動きません。

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

but either of these do: しかし、以下はどちらも動きます。

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

For greatest safety against possible future key word additions, it is recommended that you always either write <literal>AS</literal> or double-quote the output column name. 将来のキーワードの追加に対する最大限の安全性を確保するために、常にASと記述するか、出力列名を二重引用符で囲むことを推奨します。

注記

The naming of output columns here is different from that done in the <literal>FROM</literal> clause (see <xref linkend="queries-table-aliases"/>). It is possible to rename the same column twice, but the name assigned in the select list is the one that will be passed on. ここでの出力列の名前の指定は、FROM句での名前の指定(7.2.1.2を参照)とは異なります。 同じ列の名前を2度変更することができますが、渡されるのは選択リストの中で割り当てられたものです。

7.3.3. DISTINCT #

After the select list has been processed, the result table can optionally be subject to the elimination of duplicate rows. The <literal>DISTINCT</literal> key word is written directly after <literal>SELECT</literal> to specify this: 選択リストが処理された後、結果テーブルの重複行を削除の対象にすることもできます。 これを指定するためには、SELECTの直後にDISTINCTキーワードを記述します。

SELECT DISTINCT select_list ...

(Instead of <literal>DISTINCT</literal> the key word <literal>ALL</literal> can be used to specify the default behavior of retaining all rows.) DISTINCTの代わりにALLキーワードを使用して、すべての行が保持されるというデフォルトの動作を指定することができます。)

Obviously, two rows are considered distinct if they differ in at least one column value. Null values are considered equal in this comparison. 少なくとも1つの列の値が異なる場合、もちろん、それら2行は異なるとみなされます。 NULL値同士は、この比較において等しいとみなされます。

Alternatively, an arbitrary expression can determine what rows are to be considered distinct: また、任意の式を使用して、どの行が別であるかを決定することもできます。

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

Here <replaceable>expression</replaceable> is an arbitrary value expression that is evaluated for all rows. A set of rows for which all the expressions are equal are considered duplicates, and only the first row of the set is kept in the output. Note that the <quote>first row</quote> of a set is unpredictable unless the query is sorted on enough columns to guarantee a unique ordering of the rows arriving at the <literal>DISTINCT</literal> filter. (<literal>DISTINCT ON</literal> processing occurs after <literal>ORDER BY</literal> sorting.) ここでexpressionは、すべての行で評価される任意の評価式です。 すべての式が等しくなる行の集合は、重複しているとみなされ、集合の最初の行だけが出力内に保持されます。 DISTINCTフィルタに掛けられる行の順序の一意性を保証できるよう十分な数の列で問い合わせを並べ替えない限り、出力される集合の最初の行は予想不可能であることに注意してください。 (DISTINCT ON処理は、ORDER BYによる並べ替えの後に行われます。)

The <literal>DISTINCT ON</literal> clause is not part of the SQL standard and is sometimes considered bad style because of the potentially indeterminate nature of its results. With judicious use of <literal>GROUP BY</literal> and subqueries in <literal>FROM</literal>, this construct can be avoided, but it is often the most convenient alternative. DISTINCT ON句は標準SQLではありません。 さらに、結果が不定となる可能性があるため、好ましくないスタイルとみなされることもあります。 GROUP BYFROM中の副問い合わせをうまく使うことにより、この構文を使わずに済みますが、DISTINCT ON句はしばしば非常に便利な代案となります。