PostgreSQLでカンマ区切りのデータを行に変換する

休日のフラグが、text型のカラムに365日カンマ区切りで保存されているデータがある。

例えば、次のようなSELECT結果になるもの。

SELECT hol_flg FROM holiday_tbl WHERE nendo=2013

<結果>
0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,・・・省略(365日分ある)


これを1日1行のデータに変換したい場合を考える。


まず、カンマ区切りのデータを行に変換するには、「regexp_split_to_table」を利用する。

SELECT regexp_split_to_table((SELECT hol_flg FROM holiday_tbl WHERE nendo=2013), ',');
 regexp_split_to_table
-----------------------
 0
 0
 0
 0
 0
 0
 1
 0
 0
 0
 0
 0
 0
 1
 0


次に、年月日をインクリメントするには、「generate_series」を利用する。

SELECT generate_series('2013-04-01','2014-03-31', '1 day'::interval)::date;
 generate_series
-----------------
 2013-04-01
 2013-04-02
 2013-04-03
 2013-04-04
 2013-04-05
 2013-04-06
 2013-04-07
 2013-04-08
 2013-04-09
 2013-04-10
 2013-04-11
 2013-04-12
 2013-04-13
 2013-04-14
 2013-04-15
・・・


これらを組み合わせる。

SELECT (generate_series('2013-04-01','2014-03-31', '1 day'::interval)::date), 
    regexp_split_to_table((SELECT hol_flg FROM holiday_tbl WHERE hol_nendo=2013), ',');
 generate_series | regexp_split_to_table
-----------------+-----------------------
 2013-04-01      | 0
 2013-04-02      | 0
 2013-04-03      | 0
 2013-04-04      | 0
 2013-04-05      | 0
 2013-04-06      | 0
 2013-04-07      | 1
 2013-04-08      | 0
 2013-04-09      | 0
 2013-04-10      | 0
 2013-04-11      | 0
 2013-04-12      | 0
 2013-04-13      | 0
 2013-04-14      | 1
 2013-04-15      | 0
・・・