PostgreSQL

PostgreSQL valueリスト

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)

スポンサーリンク