对于简单的查询
runDb . select . from $ \cell -> do
where_ $ cell ^. CellCode ==. val "x"
return cell
我想在将字段值与“x”进行比较之前应用函数。原因是单元格代码在数据库中具有尾随空格,并且没有比将它们修剪掉更容易的,例如,来自Data.Text
的{{3}}。但是,我最初使用fmap
(两次)的方法导致了
No Instance for (Functor SqlExpr)
我知道Esqueleto提供的函数,如just
,可以完成类似的事情(我找不到just
的实现)。
有没有办法对打包值应用任何函数?
写作时:在我的具体情况下,我可能想要使用like
。
编辑:添加了我想要应用的特定功能。
答案 0 :(得分:1)
有关添加postgresql函数here的帖子,请参阅trim
:
import Database.Esqueleto.Internal.Sql
trim :: (IsString s) => SqlExpr (Value s) -> SqlExpr (Value s) -> SqlExpr (Value s)
trim pattern target =
unsafeSqlFunction "trim" (unsafeSqlBinOp "FROM" pattern target)
(如果你没有使用postgres,你可能需要查阅数据库中的文档,看它是否支持类似的东西。)
unsafeSqlFunction
可用于导入数据库支持的任何函数,但它不安全,因为您有责任确保类型签名实际上是数据库所期望的。该名称将按字面复制到您的SQL。
unsafeSqlBinOp
类似,但它定义了二进制操作:unsafeSqlBinOp "FROM" "a" "b"
被翻译为SQL "a" FROM "b"
。
有了这个,你应该能够做到:
runDb . select . from $ \cell -> do
where_ $ trim " " (cell ^. CellCode) ==. val "x"
return cell