我构建一个连接几个表的查询,并进一步限制结果,除非一个名为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后端,但理想情况下这应该不重要,对吗?
答案 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)
。