【问题标题】:Order by NULL then id asc按 NULL 排序,然后 id asc
【发布时间】:2015-08-06 23:09:40
【问题描述】:

我想要以下订单:

1
2
3
NULL
NULL

目前我有以下查询:

ItemInstance.objcts.filter(tv_series_id=item.pk).order_by('id')

这将按 id ASC 排序,但 NULL 将出现在开头。如何在不进行第二次查询的情况下将 NULL 推到最后?

【问题讨论】:

标签: python mysql django


【解决方案1】:

您需要弄清楚如何将NULL 值转换为可比较的值。这是使用.annotate() 的一种方法:

ItemInstance.objects.filter(tv_series_id=item.pk).annotate(
    null_ids=Count('id')
).order_by('-null_ids', 'id')

或者,我认为您也可以使用.extra() 使用原始 SQL 获得相同的结果:

ItemInstance.objects.filter(tv_series_id=item.pk).extra(
    'select': {
        'is_null': 'CASE WHEN id IS NULL THEN 0 ELSE 1 END'
    }
).order_by('-is_null', 'id')

【讨论】:

    【解决方案2】:

    您可以使用extra 定义一个自定义字段,当id 不为空时为0,否则为1。然后可以先按这个字段排序,先得到非空值,再按id排序。

    ItemInstance.objects.filter(tv_series_id=item.pk).extra(
        select={'isnull': 'CASE WHEN id IS NULL THEN 1 ELSE 0 END'}
    ).order_by('isnull', 'id')
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 Postgresql,您可以设置该列上的索引以将 NULL 放在首位或最后,例如:

      CREATE INDEX myindex ON mytable (mycolumn ASC NULLS LAST);
      

      然后数据库会处理它。

      如果索引已经存在,你可以修改它..你也可以,如果你不习惯直接 SQL,使用 pgadmin.. 右键单击​​索引并选择属性,你会发现里面的设置......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2020-02-15
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多