Esqueletoで関数
Yesodやってて、関数を使う必要性があったのですがいまいちやり方が曖昧だったので調べてみた、案外簡単だった。
面倒くさいのでだいぶはしょる、Handlerから使う想定、kusoをした時刻がNULLなら「1800-01-01 00:00:00 UTC」にする。
import qualified Database.Esqueleto as E import qualified Database.Esqueleto.Internal.Sql as E ... ... kusoTime :: HandlerFor App ([E.Value UTCTime]) kusoTime = runDB $ do result <- E.select $ E.from $ \table -> do return $ coalesceDate (table E.^. KusoLastKusoTime) return result where coalesceDate :: E.SqlExpr (E.Value (Maybe UTCTime)) -> E.SqlExpr (E.Value UTCTime) coalesceDate t = E.unsafeSqlFunction "COALESCE" (t, defDate') defDate :: E.SqlExpr (E.Value UTCTime) defDate = E.unsafeSqlValue "TIMESTAMP \'1800-01-01 00:00:00 UTC\'"こう書くと
SELECT COALESCE("kuso"."last_kuso_time", TIMESTAMP '1800-01-01 00:00:00 UTC') FROM "kuso"こんなSQLが出力される、2020年。