如何根据两列对 table in ecto 进行排序
How to sort table in ecto based on two columns
我有 table 和 time
和 operation
列。操作列包括 create
、update
和 delete
值,时间有 elixir utc 日期时间。我想根据日期时间进行排序,如果根据相同的时间戳存在多行,我想先取 delete
行,而不是 create
和 update
.
错误:
1. { time: TIME1, operation: "create" }
2. { time: TIME1, operation: "delete" }
3. { time: TIME1, operation: "update" }
正确
1. { time: TIME1, operation: "delete" }
2. { time: TIME1, operation: "create" }
2. { time: TIME1, operation: "update" }
所以它总是优先考虑 delete
而不是 create
会被选中,与 update
相关的值应该最后出现。
如果我们使用以下查询执行此操作,它将始终接受“删除”作为第一个值,但不会对 update
和 create
行进行排序。我很想知道我们是否可以以某种方式扩展此查询中片段的使用,以根据所有 create
、update
和 delete
字段进行排序。
|> order_by([e],
asc: e.time,
desc: e.operation == "delete"
)
你可以试试这个(如果你使用 postgres):
|> order_by([e],
asc: e.time,
asc: fragment("CASE ? WHEN 'delete' THEN 1 WHEN 'create' THEN 2 WHEN 'update' THEN 3 END", e.operation)
)
有关此类订购的详细信息:sql ORDER BY multiple values in specific order?
我有 table 和 time
和 operation
列。操作列包括 create
、update
和 delete
值,时间有 elixir utc 日期时间。我想根据日期时间进行排序,如果根据相同的时间戳存在多行,我想先取 delete
行,而不是 create
和 update
.
错误:
1. { time: TIME1, operation: "create" }
2. { time: TIME1, operation: "delete" }
3. { time: TIME1, operation: "update" }
正确
1. { time: TIME1, operation: "delete" }
2. { time: TIME1, operation: "create" }
2. { time: TIME1, operation: "update" }
所以它总是优先考虑 delete
而不是 create
会被选中,与 update
相关的值应该最后出现。
如果我们使用以下查询执行此操作,它将始终接受“删除”作为第一个值,但不会对 update
和 create
行进行排序。我很想知道我们是否可以以某种方式扩展此查询中片段的使用,以根据所有 create
、update
和 delete
字段进行排序。
|> order_by([e],
asc: e.time,
desc: e.operation == "delete"
)
你可以试试这个(如果你使用 postgres):
|> order_by([e],
asc: e.time,
asc: fragment("CASE ? WHEN 'delete' THEN 1 WHEN 'create' THEN 2 WHEN 'update' THEN 3 END", e.operation)
)
有关此类订购的详细信息:sql ORDER BY multiple values in specific order?