想知道是否有人可以帮助我解决数组聚合器问题
我有一个查询,该查询使用联接表进行联接,然后过滤掉给定数组内的所有值,并过滤掉另一个数组内的值。
代码如下:
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 AND C,而不仅仅是A和C。
有人有什么想法吗?
答案 0 :(得分:0)
我相信您想使用@>
运算符,而不要使用重叠的&&
运算符:
having(fragment("array_agg(t2.name) @> (?)::varchar[]", ^good_ingredients))
参考:https://www.postgresql.org/docs/current/functions-array.html#ARRAY-OPERATORS-TABLE