2

对于这样简单的查询

runDb . select . from $ \cell -> do
  where_ $ cell ^. CellCode ==. val "x"
  return cell

我想在将字段值与“x”进行比较之前应用一个函数。原因是单元格代码在数据库中有尾随空格,没有什么比将它们修剪掉更容易的了,例如使用strip from Data.Text。但是,我最初使用fmap(两次)的方法导致

No Instance for (Functor SqlExpr)

我知道 Esqueleto 提供了一些功能,例如just,专门完成类似的事情(虽然我找不到 的实现just)。

有没有办法对打包值应用任何函数?

写作时:在我的具体情况下,我可能只想使用like.

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

4

2 回答 2

2

你想应用什么样的功能?

以下是某人如何添加chr()在查询中调用函数的能力:

https://github.com/krisajenkins/esqueleto/commit/fa1d1c888770e297fef52d76b6cb68342a6c0376

如果它是内置函数(或用户可定义函数),也许你可以做类似的事情。

于 2015-08-27T21:58:58.970 回答
1

有关添加 postgresql 函数的帖子,请参见此处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
于 2015-08-28T13:09:50.630 回答