Elixir Ecto查询-保留输出顺序

问题描述 投票:0回答:1

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

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

我匹配的句段的输出与列表中的顺序不同。例如。如果这是Enum.map,则将保留订单。我可以仅使用一个查询来执行此操作,而不必执行Enum.each之类的方法吗?

elixir ecto
1个回答
1
投票
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()
© www.soinside.com 2019 - 2024. All rights reserved.