我有一行有三个可能的结果
no
neutral
yes
我想保留这个顺序。 Desc
或ASC
将不匹配。那么,有什么方法可以指定预期的订单是什么?
不确定是否相关,但我正在使用 sql 炼金术。
.order_by(Survey.rating).all()
数组对于Postgres中的这种类型的逻辑来说很方便。 一种方法是:
array_position(array['no', 'neutral', 'yes'], colname)
这很方便,因为它很容易扩展到更多值。
没有自然序列时,可以使用 case 表达式来控制排序。
order by case col1 when 'no' then 1 when 'neutral' then 2 else 3 end
截至今天,我使之前的答案工作正常:
from sqlalchemy import func
from sqlalchemy.dialects.postgresql import array
...
select_query.order_by(
func.array_position(
array((first_id, second_id)),
self.table.c.id,
)
)
请注意,您应该将元组传递到带有 id 的数组函数中,而不是列表(至少我在array([first_id, second_id])
上遇到了错误(。
对于sqlalchemy API,我们可以使用'func'
from sqlalchemy import func
.order_by(func.array_position(array['no', 'neutral', 'yes'], colname) )
但是我们也应该检查 colname
的 cast 类型,b/c 我们需要明确指示元素的数据类型(sqlalchemy 为此cast
了一个函数(。
然后指示类型,我们将有以下内容:
from sqlalchemy import cast, Text
.order_by(func.array_position(array['no', 'neutral', 'yes'], cast(table.c.colname, Text)) )