他のバージョンの文書 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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 BYLIMIT(これと等価なFETCH FIRST)、そしてOFFSET句をVALUESコマンドで使用することができます。

パラメータ

expression

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

sort_expression

式あるいは整数の定数で、結果の行をソートする方法を表します。 この式は、VALUESの結果の列をcolumn1column2などのように参照することができます。 詳細はSELECT文書のORDER BY句を参照してください。

operator

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

count

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

start

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

注釈

VALUESで大量の行を扱うことは避けるべきです。 メモリ不足や性能の劣化を生じさせる可能性があります。 VALUESINSERTの中で使用する場合は特別です。 (列の型は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;

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

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

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およびOFFSETPostgreSQLの拡張です。 SELECTも参照してください。

関連項目

INSERT, SELECT