0

我构建了一个查询,该查询连接了几个表并进一步限制了结果,除非一个名为IncludeAllequals的字段True

我正在尝试这样写

fetch i = runDb . select . from $ \(a, b, c) -> do
  where_ $
        a ^. AId ==. valkey i
    &&. b ^. BField1 ==. a ^. AField2
    &&. c ^. CField1 ==. a ^. AField3
  unless (unValue $ b ^. BIncludeAll) $
    where_ $ b ^. BField2 == c ^. CField2
  return  b

但我收到以下错误

无法将预期类型与第一个参数中的Bool实际类型匹配Database.Esqueleto.Internal.Language.Value Boolunless

所以unValue不知何故不能解决问题。事实上,类似的东西b ^. BIncludeAll有 type expr (Value a)

查看源代码中的定义对SqlExpr我也没有帮助:

这是一个ADT:

 data SqlExpr a where ...

PS:我使用 SQL 后端,但理想情况下这不重要,对吧?

4

1 回答 1

2

unless期望 aBool作为其参数,这意味着“Haskell 世界”中的布尔值。您正在传递它unValue $ b ^. BIncludeAll,但b ^. BIncludeAll它不是 type Value Bool,它是一个SqlExpr (Value Bool),它代表“数据库世界”中的布尔表达式。这是一个 SQL 语句,在评估时返回一个布尔值。SqlExpr (Value Bool)变成实际的唯一方法Value Bool是调用select $ from $ ....

正如其他人所指出的,正确的方法是使用where_ (b ^. BIncludeAll ||. b ^. BField2 ==. c ^. CField2).

于 2015-08-28T23:18:23.170 回答