首页 > 解决方案 > Elixir Ecto 查询 - 保留输出顺序

问题描述

我有一个 id 列表["123", "321", "101"]

和一个查询segments = Repo.all(from(s in Segment, where: s.id in ^ids))

我的匹配段的输出与列表中的顺序不同。例如,如果这是一个,Enum.map那么订单将被保留。有没有一种方法可以做到这一点,只使用一个查询,而不必做类似的事情Enum.each

标签: elixirecto

解决方案


这是我尝试将@zwippie 的评论中的一个答案转换为 Ecto(对于 Postgres):

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()

推荐阅读