休日のフラグが、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 ・・・