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コマンドを使用することができます。
定数あるいは式です。これを計算した結果が、 表 (行セット) の中の指定した場所に挿入されます。 VALUES リストを INSERT の最上位レベルで使用する場合は、 expression を DEFAULT で置き換えることができます。これは、そのカラムのデフォルト値を挿入することを表します。 他の場所で VALUES を使用する場合には、 DEFAULT は使用できません。
式あるいは整数の定数で、結果の行をソートする方法を表します。 この式は、VALUES の結果のカラムを column1、column2などのように参照することができます。 詳細は ORDER BY句 を参照ください。
ソート用の演算子です。詳細は ORDER BY句 を参照ください。
返す行の最大数です。詳細は LIMIT句 を参照ください。
結果を返す際に読み飛ばす行数です。詳細は 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 のスカラリスト形式を使用するほうがよいでしょう。 スカラメソッドのリストのほうが記述量が減りますし、たいていはより効率的になります。