具有显式顺序的顺序子句



我有一行有三个可能的结果

no 
neutral
yes

我想保留这个顺序。 DescASC将不匹配。那么,有什么方法可以指定预期的订单是什么?

不确定是否相关,但我正在使用 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)) ) 

最新更新