読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

部分フィールドの抽出

PostgreSQL

詳しくは書けないが、たとえば以下のようなテーブルがあったとする。

term_start  date
term_end    date
number      int

このterm_startとterm_endをみて、case文をクエリに書こうとするときにdate型とinterval型を混ぜて演算させると、戻り値がinterval型になってしまう。一方date型同士で純粋に演算させるとinteger型が返ってくる。たとえばこんな具合。*1

select
  case when term_end > some_day then term_end - term_start + '2 days'::interval
  else term_end - term_start end as hoge
from
  table

この場合、case文の条件によって返り値が変わってしまうためエラーが起きる。しかしここでextract関数を使ってやるとうまくいくことがある。たとえば上の例で最初の条件をinteger型にしたいときはwhen以下を

extract (days from ((term_end - term_start + '2 days')::interval))

としてあげたりとか。「直接castすればいいではないか」と思うかもしれないが、その場合たとえば問題の部分の戻り値が"5 days"だった場合、それをどの単位にすればよいのか判断できないため「interval型はinteger型に変換できない」旨のエラーが発生する。
詳しくは以下のページ参照。

*1:実際に試したコードとは違うので期待通りに動作するとは限りません