Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to build WHERE IN array clause with Ecto?

How to find posts in given List of ids?

This isn't working:

posts = Post |> where(id: [1, 2]) |> Repo.all

Example in Rails:

Post.where({ id: [1, 2]})
# SELECT * FROM posts WHERE id IN (1, 2)
like image 624
luzny Avatar asked Apr 23 '16 17:04

luzny


3 Answers

The following should work:

posts = Post |> where([p], p.id in [1, 2]) |> Repo.all
like image 82
Gazler Avatar answered Nov 04 '22 13:11

Gazler


Accepted answer gives undefined function p/0 to me, so I came to this:

from(p in Post, where: p.id in [1, 2]) |> Repo.all
like image 36
denis.peplin Avatar answered Nov 04 '22 13:11

denis.peplin


Other posters gave both the "keywords" and "expressions" patterns needed but I wanted to comment and point out that if you are interpolating the values from a list, you need the ^ operator before the variable. You also need to be importing the module which contains the macros (special because macros have different compilation needs) before trying either of these. This is all with ecto 2.1.4, btw. So:

import Ecto.Query
...

id_list = [1,2,4,5,6]


# "expressions"

Post
|> where([p], p.id in ^id_list)


# "keywords"

from(p in Post, where: p.id in ^id_list)
like image 35
jnmandal Avatar answered Nov 04 '22 13:11

jnmandal