我正在尝试使用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数据库仍然会提供这样一个基本功能......
答案 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