PostgreSQLのVALUEリストがありがたいです。
VALUEリストの使用例
select * from ( values (1, '大嶋', 'oshima'), (2, '中嶋', 'nakajima'), (3, '小嶋', 'kojima') ) as t( lno, name, roma );
-- Oracleに慣れ親しんだ私などは以下のような
-- SQLをイメージしますが PostgreSQLのVALUESリストは 美しいです。
-- oracleだとfrom dualが必要になるのでさらにゴチャゴチャします
--
myposdb=# select 1 as lno,'大嶋' as name,'oshima' as roma
myposdb-# union all select 2 as lno,'中嶋' as name,'nakajima' as roma
myposdb-# union all select 3 as lno,'小嶋' as name,'kojima' as roma
myposdb-# ;
lno | name | roma
-----+------+----------
1 | 大嶋 | oshima
2 | 中嶋 | nakajima
3 | 小嶋 | kojima
(3 行)
myposdb=# select * from (
myposdb(# values
myposdb(# (1, '大嶋', 'oshima'),
myposdb(# (2, '中嶋', 'nakajima'),
myposdb(# (3, '小嶋', 'kojima')
myposdb(# ) as t(
myposdb(# lno, name, roma
myposdb(# );
lno | name | roma
-----+------+----------
1 | 大嶋 | oshima
2 | 中嶋 | nakajima
3 | 小嶋 | kojima
(3 行)
myposdb=#
insert into values で一度に複数レコードinsertできる
この構文はPostgreSQLだけでなくMySQLでも有効です。残念ですがOracleでは使えません。Oracleではinsert allを使ってこれに代わる事を実現するのですが、こちらの構文のほうが便利です。Oracleを少しフォローするとinsert allの場合、同時に複数テーブルに対するINSERTも可能になっています。
insert values 句
insert into wardcity(prefectures,ward) values ('千葉県','千葉市中央区') , ('千葉県','千葉市稲毛区') , ('千葉県','千葉市緑区');
実行例
-- 検証用テーブル作成
myposdb=# create table wardcity
myposdb-# (
myposdb(# rid serial,
myposdb(# prefectures varchar(10),
myposdb(# ward varchar(40)
myposdb(# );
CREATE TABLE
-- insert values句
myposdb=# insert into wardcity(prefectures,ward) values
myposdb-# ('千葉県','千葉市中央区')
myposdb-# , ('千葉県','千葉市稲毛区')
myposdb-# , ('千葉県','千葉市緑区');
INSERT 0 3
-- insert データ確認
myposdb=# select * from wardcity;
rid | prefectures | ward
-----+-------------+--------------
1 | 千葉県 | 千葉市中央区
2 | 千葉県 | 千葉市稲毛区
3 | 千葉県 | 千葉市緑区
(3 rows)