ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

課題への挑戦

MySQL で試したことを PostgreSQL でやるとどうなるか。

先ずはテーブル作成

$ psql83 -U postgres
postgres=# create table master(tmp1 varchar(10), tmp2 varchar(10), tmp3 varchar(10) );
CREATE TABLE
postgres=# create table code(tmp1 varchar(10), tmp2 varchar(10), tmp3 varchar(10), tmp4 varchar(10));
CREATE TABLE

コピー文でデータを投入。
ちなみに psql で接続中のカレントディレクトリはDB本体が存在するディレクトリ以下になる。
小生の場合は/opt/local/var/db/postgresql83/defaultdb なので、この下にコピーする元ネタを配置。

postgres=# copy master from 'master.csv' delimiters ',';
COPY 6
postgres=# copy code from 'code.csv' delimiters ',';
COPY 6

絶対パスで指定すればすむ話だけどいろいろ面倒なので…
準備が整ったので結果を出力。

postgres=# \a
Output format is unaligned.  // SELECT 結果をフォーマット無しで返す。

postgres=# \t
Showing only tuples.     // ヘッダ行、出力件数を表示しない。

postgres=# \pset fieldsep ','
Field separator is ",".      // セパレータを変更

上記は psql 接続が終了するまでの反映。一回切断するともとに戻ります。懐かしい…
あとは出力先を指定してSELECT文を発行と。ちなみにファイルの出力先は接続したときのディレクトリがカレントになります。ので権限が無くてファイルが出力できないよー的なことは通常発生しないはず。

postgres=# \o result.csv
postgres=# select * from master m,code c where m.tmp1 = c.tmp1;

結果確認ー

postgres=# \q
$ cat result.csv
123,aaa,bbb,123,test2,test_test,test5
456,iii,jjj,456,test4,test_test,test3
789,kkk,mmm,789,test6,test_test,test1
123,ccc,ddd,123,test2,test_test,test5
123,eee,fff,123,test2,test_test,test5
111,ggg,hhh,111,test1,test_test,test6

PostgreSQLだとこんな感じか…