このエントリーをはてなブックマークに追加


PostgreSQLでカラムの文字列を連結する・ダブルパイプ

ダブルパイプ(||)を使うと文字列の連結を行うことができます。
以下にダブルパイプ(||)の使用例を記します。

関連記事・関連資料

ダブルパイプ(||)の使用例を実施した環境

本資料を実行するために使用した環境を以下に記します。

  • OS : CentOS6
  • PostgreSQL 8.4.13

作成したテーブルと挿入したデータは以下の通りです。

  • t1テーブル
    sakura=# create table t1 (c1 varchar(10), c2 varchar(10), c3 varchar(10));
    CREATE TABLE
    sakura=# insert into t1 values('abc', 'def', 'ghi'),('jkl','mno','pqr');
    INSERT 0 2
    sakura=# select * from t1;
     c1  | c2  | c3  
    -----+-----+-----
     abc | def | ghi
     jkl | mno | pqr
    (2 行)
  • t2テーブル
    sakura=# create table t2 (n1 int, n2 int, n3 int);
    CREATE TABLE
    sakura=# insert into t2 values(1,2,3),(4,5,6);
    INSERT 0 2
    sakura=# select * from t2;
     n1 | n2 | n3 
    ----+----+----
      1 |  2 |  3
      4 |  5 |  6
    (2 行)

ダブルパイプ(||)を使ってカラム内容を連結してみる

ダブルパイプ(||)を使ってカラム内容を連結してみます。

character varying(VARCHAR)のカラムで実施

カラム名をダブルパイプ(||)で連結した時のSQLです。
c1,c2,c3のカラム内容が連結されているのが確認できます。

sakura=# select c1||c2||c3 as concat from t1;
  concat   
-----------
 abcdefghi
 jklmnopqr
(2 行)

integerのカラムで実施

数値カラムで連結した例は以下の通りです。
to_charにより文字列に変換し、桁あわせで発生した余分なスペースをtrimで削除しています。

sakura=# select trim(to_char(n1,'9'))||trim(to_char(n2,'9'))||trim(to_char(n3,'9')) as concat from t2;
 concat 
--------
 123
 456
(2 行)

ダブルパイプを使ってcsv出力してみる

PostgreSQLでは、psqlのオプションである、-A, -Fなどを利用すれば簡単にcsv出力できますが、この資料ではダブルパイプをつかって出力してみます。
ダブルパイプでカラム間にカンマが表示されるようにします。
以下、実行結果です。

sakura=# select c1 ||','|| c2 ||','|| c3  from t1;
  ?column?   
-------------
 abc,def,ghi
 jkl,mno,pqr
(2 行)

実際にcsvファイルとして出力してみます。
psqlで\t onを指定しタプルのみの表示としています。
また、\oでファイルに出力するようになります。

sakura=# \t on
タプルのみを表示しています。
sakura=# \o concat.csv
sakura=# select c1 ||','|| c2 ||','|| c3  from t1;
sakura=# 

catコマンドで作成したファイルを確認するとカンマ区切りのcsvファイルが作成されています。

$ cat concat.csv 
 abc,def,ghi
 jkl,mno,pqr

psqlで指定した\t, \oをもとに戻す場合は以下の操作を行います。

sakura=# \t off
「タプルのみ表示」は off です。
sakura=# \o

以上、ダブルパイプ(||)の使用例でした。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:08:00