ECTO查询以获取满足Array_aggregator中所有值的所有值,不仅仅是任何值



想知道是否有人可以帮助我解决数组聚合器问题

我有一个查询,可以使用加入表进行加入,然后将其过滤在给定数组中的所有值并过滤出另一个数组中的值。

代码看起来像这样:

      Product
      |> join(:inner, [j], jt in "job_tech", on: j.id == jt.product_id)
      |> join(:inner, [j, jt], t in Tech, on: jt.ingredient_id == t.id)
      |> group_by([j], j.id)
      |> having_good_ingredients(good_ingredients)
      |> not_having_bad_ingredients(bad_ingredients)

使用having_good_ingredients看起来像这样:

def having_good_ingredients(query, good_ingredients) do
    if Enum.count(good_ingredients) > 0 do
      query
      |> having(fragment("array_agg(t2.name) && (?)::varchar[]", ^good_ingredients))
    else
      query
    end
  end

这有效,但它会抓住所有满足good_stacks数组中任何值的值即,如果我的数组中有[A,C],我想返回具有A和C的值,而不仅仅是A,而不仅仅是C。

有人有任何想法吗?

我相信您想使用@>操作员,而不是重叠的&&操作员:

having(fragment("array_agg(t2.name) @> (?)::varchar[]", ^good_ingredients))

参考:https://www.postgresql.org/docs/current/functions-array.html#array-operators-table

相关内容

最新更新