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

时间:2019-07-17 05:20:15

标签: elixir ecto

我实际上试图在ecto中运行此查询,但使用参数化值:

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)参数的长度必须为0,用于查询%Postgrex.Query

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

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

对我如何有效地设置ID值有任何见解?

2 个答案:

答案 0 :(得分:3)

您不能在字符串中使用“占位符”,但不需要字符串,需要数组,因此可以:

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

但是作为GIN index also supports = operator on arrays,它也应该与ANY一起使用,因此您可以编写:

where: ^id in b.admins

答案 1 :(得分:0)

除非绝对需要使用@>运算符,否则使用ANY应该可以:

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