我有一个ID列表["123", "321", "101"]
和查询segments = Repo.all(from(s in Segment, where: s.id in ^ids))
我匹配的句段的输出与列表中的顺序不同。例如。如果这是Enum.map
,则将保留订单。我可以仅使用一个查询来执行此操作,而不必执行Enum.each
之类的方法吗?
defmodule Segment do
...
def by_id_in_order(query, ids) do
query
|> join(:inner, [s], o in fragment("SELECT * FROM UNNEST(?::int[]) WITH ORDINALITY AS o (id, ordinal)", ^ids), on: s.id == o.id)
|> order_by([s, o], asc: o.ordinal)
end
end
使用方式
Segment
|> Segment.by_id_in_order([123, 321, 101])
|> Repo.all()