VALUES — 行セットを計算する
VALUES (expression[, ...] ) [, ...] [ ORDER BYsort_expression[ ASC | DESC | USINGoperator] [, ...] ] [ LIMIT {count| ALL } ] [ OFFSETstart[ 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も参照してください。