0

いくつかのテーブルを結合し、 1 つのフィールドがequalsでない限り結果をさらに制限するクエリを作成します。IncludeAllTrue

こんな感じで書いてみました

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

unlessBool引数としてa を期待します。これは、「Haskell ワールド」のブール値を意味します。あなたはそれを渡していますがunValue $ b ^. BIncludeAllb ^. BIncludeAllタイプ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 に答える