elixir - Elixir Ecto 查询 - 保留输出顺序
问题描述
我有一个 id 列表["123", "321", "101"]
和一个查询segments = Repo.all(from(s in Segment, where: s.id in ^ids))
我的匹配段的输出与列表中的顺序不同。例如,如果这是一个,Enum.map
那么订单将被保留。有没有一种方法可以做到这一点,只使用一个查询,而不必做类似的事情Enum.each
?
解决方案
这是我尝试将@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()
推荐阅读
- python - 用 Python 保证数据科学的质量标准
- python - 在张量流中将布尔张量转换为二进制
- cplex - CPLEX 切割名称的含义
- java - 工作流失败的Spring批处理退出消息
- gmail - Google App Script:重复发生的电子邮件自动回复
- javascript - 在 NetSuite 的 HTML Suitelet 中将选择选项添加到下拉字段
- spring-data-jpa - Mockito:捕获 Spring Data saveOrUpdate() 参数时的 NPE
- forms - mailchimp 平台上注册表单中的页脚
- javascript - 如何在赛普拉斯中存根模块
- java - 如何将不同子类的两个对象组合成第三个子类?