在 django(postgres 后端)中按数字字符串排序查询结果

Posted

技术标签:

【中文标题】在 django(postgres 后端)中按数字字符串排序查询结果【英文标题】:Ordering query result by numeric strings in django (postgres backend) 【发布时间】:2012-02-15 01:13:34 【问题描述】:

我有一个表,其名称 (varchar) 字段仅包含数字字符串,我想按此字段对查询进行排序。但是名称字段是按字母顺序排列的,但我希望它们按数字顺序排列。 例如,如果我得到 1 2 200 100 作为名称字段值,它的排序就像 1 100 2 200 但我需要他们是 1 2 100 200。

我可以提出以下行查询

select *
from my_table as t
where t.foo='bar'
order by cast(t.name as integer);

但不能将其表示为 django orm 查询集?有什么办法吗?

【问题讨论】:

【参考方案1】:

我首先要问为什么你有一个需要被视为数字的 varchar 列,但没关系。

您可以使用extra queryset 方法来转换您的字符串:

MyTable.objects.extra(select='int_name': 'CAST(t.name AS INTEGER)',
                      order_by=['int_name'])

【讨论】:

如果列中的一个或多个值不是有效整数会发生什么,它会诉诸字母顺序,不应用顺序还是失败? 它会在 PostgreSQL 上失败,但在 mysql 上会很好......我从 db 转换后才发现......如果有人知道如何规避它,那就太好了! 对此解决方案感兴趣,我们有一个包含文本和整数的列。排序时,“10”位于“1”旁边,而不是“9”下方。

以上是关于在 django(postgres 后端)中按数字字符串排序查询结果的主要内容,如果未能解决你的问题,请参考以下文章

Django:检测数据库后端

用于创建数据库、运行测试的 Django / postgres 设置

如何使用 django ORM 在 postgres 中仅选择日期部分

如何在Postgres中按年月按最大(日期)组获取行?

如何使用 Postgres 在 Rails 中按天对记录进行分组

如何在 Spring Boot JPA 中按 Postgres 的 json 属性排序?