如何在数组中使用Ecto.Adapters.SQL.query?

时间:2016-03-20 14:19:27

标签: sql elixir ecto

我正在尝试使用Ecto.Adapters.SQL.query,它运行正常,但不适用于数组。例如,此语句失败:

Ecto.Adapters.SQL.query Repo, "SELECT p.* FROM posts p WHERE p.title in ($1)", 
  [["title1", "title2"]]

错误:

** (ArgumentError) Postgrex expected a binary that can be encoded/cast to
type "text", got ["title1", "title2"]. Please make sure the value you are
passing matches the definition in your table or in your query or convert
the value accordingly.

更新

没有简单的方法可以做到这一点,但它不是Ecto的限制,它是限制SQL数据库/ PostgreSQL more details and workaround

很难相信在2016年SQL数据库仍然会提供这样一个基本功能......

2 个答案:

答案 0 :(得分:2)

我认为这个问题的答案与你之前的问题几乎完全相同。只需使用here中的in语法即可。

<强>更新

要为您的示例运行原始SQL查询,可以使用以下命令:

Ecto.Adapters.SQL.query(MyApp.Repo, "SELECT p.* FROM POSTS p WHERE p.TITLE IN ($1, $2)", ["title1", "title2"])

答案 1 :(得分:2)

如果你正在使用Postgres,你也可以使用ANY

Ecto.Adapters.SQL.query(
  Repo,
  "SELECT p.* FROM posts p WHERE p.title = ANY($1)", 
  [["title1", "title2"]]
)

Postgres产生same query plan for In vs Any