我有一行,其中有三个可能的结果
no neutral yes
我想保留这个顺序。Desc或ASC将不匹配。那么,有什么方法可以指定期望的顺序呢?不确定是否相关,但我正在使用sql炼金术。
Desc
ASC
.order_by(Survey.rating).all()
lbsnaicq1#
在Postgres中,数组可以方便地用于这种类型的逻辑。
array_position(array['no', 'neutral', 'yes'], colname)
这很方便,因为很容易扩展到更多的值。
11dmarpk2#
当没有自然顺序时,您可以使用case表达式来控制排序。
order by case col1 when 'no' then 1 when 'neutral' then 2 else 3 end
0tdrvxhp3#
对于sqlalchemy API,我们可以使用'func'
from sqlalchemy import func .order_by(func.array_position(array['no', 'neutral', 'yes'], colname) )
但是我们也应该检查colname的转换类型,b/c我们需要显式地指示一个元素的数据类型(sqlalchemy有一个函数cast)。然后指示类型,我们将得到以下内容:
colname
cast
from sqlalchemy import cast, Text .order_by(func.array_position(array['no', 'neutral', 'yes'], cast(table.c.colname, Text)) )
puruo6ea4#
到今天为止,我使previous answer工作正常:
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])中遇到了错误)。
array([first_id, second_id])
4条答案
按热度按时间lbsnaicq1#
在Postgres中,数组可以方便地用于这种类型的逻辑。
这很方便,因为很容易扩展到更多的值。
11dmarpk2#
当没有自然顺序时,您可以使用case表达式来控制排序。
0tdrvxhp3#
对于sqlalchemy API,我们可以使用'func'
但是我们也应该检查
colname
的转换类型,b/c我们需要显式地指示一个元素的数据类型(sqlalchemy有一个函数cast
)。然后指示类型,我们将得到以下内容:
puruo6ea4#
到今天为止,我使previous answer工作正常:
请注意,在使用id的数组函数中,您应该传递元组,而不是列表(至少我在
array([first_id, second_id])
中遇到了错误)。