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. UNION
、CASE
および関連する構文 を参照ください)。
大きなコマンドの中において、
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も参照してください。