PostgreSQL 8.4.1文書
前のページ | 巻戻し |  | 早送り | 次のページ

# VALUES

## 名前

VALUES -- 行セットを計算します

## 概要

    VALUES ( expression [, ...] ) [, ...]
        [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
        [ LIMIT { count | ALL } ]
        [ OFFSET start [ ROW | ROWS ] ]
        [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]

## 説明

`VALUES` は、値の式で指定された行あるいは行の集合を計算します。 大きなコマンドの中で"定数テーブル"を作成するために使用することが多いですが、 それ単独で使用することも可能です。

複数行を指定した場合は、すべての行の要素数が同じでなければなりません。 できあがるテーブルのカラムのデータ型を決定するには、 明示的に指定されている型やそのカラムに登場する式から推測できる型を組み合わせて使用します。 これは `UNION` と同じ方式です (項10.5 を参照ください)。

大きなコマンドの中において、 `SELECT` が文法上使える場所ならどこでも`VALUES`を使用することができます。 なぜなら、これは文法上は`SELECT`と同じ扱いだからです。 `ORDER BY`、`LIMIT`（、これと等価な`FETCH FIRST`）そして`OFFSET`句で`VALUES`コマンドを使用することができます。

## パラメータ

`expression`

  定数あるいは式です。これを計算した結果が、 表 (行セット) の中の指定した場所に挿入されます。 `VALUES` リストを `INSERT` の最上位レベルで使用する場合は、 `expression` を `DEFAULT` で置き換えることができます。これは、そのカラムのデフォルト値を挿入することを表します。 他の場所で `VALUES` を使用する場合には、 `DEFAULT` は使用できません。

`sort_expression`

  式あるいは整数の定数で、結果の行をソートする方法を表します。 この式は、`VALUES` の結果のカラムを `column1`、`column2`などのように参照することができます。 詳細は ORDER BY句 を参照ください。

`operator`

  ソート用の演算子です。詳細は ORDER BY句 を参照ください。

`count`

  返す行の最大数です。詳細は LIMIT句 を参照ください。

`start`

  結果を返す際に読み飛ばす行数です。詳細は LIMIT句 を参照ください。

## 注釈

`VALUES` で大量の行を扱うことは避けるべきです。 メモリ不足や性能の劣化を生じさせる可能性があります。 `VALUES` を `INSERT` の中で使用する場合は特別です。 (カラムの型は `INSERT` 先のテーブルからわかるので、 `VALUES` のリストを調べて型を推測する必要がないからです) そのため、他の場面に比べて大きなリストを扱っても実用に耐えます。

## 例

必要最小限の `VALUES` コマンドはこのようになります。

    VALUES (1, 'one'), (2, 'two'), (3, 'three');

これは、カラムが二つで行が三つの表を返します。事実上、これは次と同じことです。

    SELECT 1 AS column1, 'one' AS column2
    UNION ALL
    SELECT 2, 'two'
    UNION ALL
    SELECT 3, 'three';

通常は、`VALUES` は大きな SQL コマンドの内部で使用します。 最もよくあるのは、`INSERT` での使用です。

    INSERT INTO films (code, title, did, date_prod, kind)
        VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

`INSERT` 内で使用する場合には、`VALUES` のリストに `DEFAULT` を指定することができます。 これは、値を具体的に指定するのではなくそのカラムのデフォルトを使用することを表します。

    INSERT INTO films VALUES
        ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
        ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);

`VALUES` は、副`SELECT` が書ける場所ならどこでも使用することができます。 例えば `FROM` 句の中などでも使えます。

    SELECT f.*
      FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind)
      WHERE f.studio = t.studio AND f.kind = t.kind;

    UPDATE employees SET salary = salary * v.increase
      FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase)
      WHERE employees.depno = v.depno AND employees.sales >= v.target;

`VALUES` を `FROM` 句の中で使用する場合には、 `AS` 句が必須となることに注意しましょう。これは `SELECT` の場合と同様です。 `AS` 句ですべてのカラムの名前を指定する必要はありませんが、指定しておくことをお勧めします (`VALUES` のデフォルトのカラム名は、PostgreSQL においては `column1`、`column2` のようになります。 しかし、他のデータベースシステムでは異なるかもしれません)。

`VALUES` を `INSERT` の中で使用する場合は、 値の型が挿入先カラムのデータ型に自動変換されます。 それ以外の場面で使用する際には、正しいデータ型を指定する必要があるかもしれません。 値がすべてクォートされたリテラル定数である場合は、最初の値にだけ型を指定しておけば十分です。

    SELECT * FROM machines
    WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));

> ティップ: 単に `IN` を試したいのなら、上のような `VALUES` クエリを使用するよりも `IN` のスカラリスト形式を使用するほうがよいでしょう。 スカラメソッドのリストのほうが記述量が減りますし、たいていはより効率的になります。

## 互換性

`VALUES` は SQL 標準に従います。 `LIMIT`および`OFFSET`はPostgreSQL の拡張です。 SELECTも参照してください。

## 関連項目

INSERT, SELECT

前のページ | ホーム | 次のページ
VACUUM | 上に戻る | PostgreSQLクライアントアプリケーション