如何在esqueleto查询中进行比较之前应用函数

时间:2015-08-27 19:10:36

标签: database haskell esqueleto

对于简单的查询

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

编辑:添加了我想要应用的特定功能。

1 个答案:

答案 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