使用片段在 @> 运算符之后参数化值

Parameterize value after @> operator using fragments

我实际上是在尝试 运行 这个查询,但是有一个参数化的值:

select * from accounts.businesses where admins @> '{1234}';

这是我的函数定义:

def get_businesses_by_id(id) do
  from(b in Businesses, where: fragment("? @> '{?}'", b.admins, ^id))
  |> Repo.all()
end

但我收到以下错误:

** (ArgumentError) parameters must be of length 0 for query %Postgrex.Query

如果我直接在其中硬编码该值,那么它会起作用:

def get_businesses_by_id(id) do
  from(b in Businesses, where: fragment("? @> '{1234}'", b.admins))
  |> Repo.all()
end

是否了解如何有效地参数化 ID 值?

除非使用 @> operator is absolutely necessary, using ANY 应该可行:

def get_businesses_by_id(id) do
  from(b in Businesses, where: fragment("? = ANY(?)", ^id, b.admins))
  |> Repo.all()
end

你不能在字符串中使用"placeholder",但你不需要字符串,你需要数组,所以你可以这样做:

fragment("? @> ?", b.admins, ^[id])

但是作为 GIN index also supports = operator on arrays 它也应该与 ANY 一起工作所以你可以写:

where: ^id in b.admins