除非(或何时)在Esqueleto查询中如何使用?

时间:2015-07-30 16:55:27

标签: sql haskell esqueleto

我构建一个连接几个表的查询,并进一步限制结果,除非一个名为IncludeAll的字段等于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 Bool与实际类型unless匹配

所以unValue不知何故不起作用。实际上,b ^. BIncludeAll之类的内容类型为expr (Value a)

查看源代码中的definition of SqlExpr对我没有帮助:

这是一个ADT:

 data SqlExpr a where ...

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

1 个答案:

答案 0 :(得分:2)

unless期望Bool作为其参数,这意味着" Haskell世界中的布尔值"。您正在传递unValue $ b ^. BIncludeAll,但b ^. BIncludeAll不是Value Bool类型,而是SqlExpr (Value Bool),它表示"数据库中的布尔表达式世界&#34 ;.它是一个SQL语句,在评估时返回一个布尔值。将SqlExpr (Value Bool)变为实际Value Bool的唯一方法是致电select $ from $ ...

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

相关问题