postgresql 具有显式顺序的Order子句

wz3gfoph  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(4)|浏览(138)

我有一行,其中有三个可能的结果

no 
neutral
yes

我想保留这个顺序。DescASC将不匹配。那么,有什么方法可以指定期望的顺序呢?
不确定是否相关,但我正在使用sql炼金术。

.order_by(Survey.rating).all()
lbsnaicq

lbsnaicq1#

在Postgres中,数组可以方便地用于这种类型的逻辑。

array_position(array['no', 'neutral', 'yes'], colname)

这很方便,因为很容易扩展到更多的值。

11dmarpk

11dmarpk2#

当没有自然顺序时,您可以使用case表达式来控制排序。

order by case col1 when 'no' then 1 when 'neutral' then 2 else 3 end
0tdrvxhp

0tdrvxhp3#

对于sqlalchemy API,我们可以使用'func'

from sqlalchemy import func

.order_by(func.array_position(array['no', 'neutral', 'yes'], colname) )

但是我们也应该检查colname的转换类型,b/c我们需要显式地指示一个元素的数据类型(sqlalchemy有一个函数cast)。
然后指示类型,我们将得到以下内容:

from sqlalchemy import cast, Text

.order_by(func.array_position(array['no', 'neutral', 'yes'], cast(table.c.colname, Text)) )
puruo6ea

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])中遇到了错误)。

相关问题