按NULL排序然后是id asc

时间:2015-08-06 23:09:41

标签: python mysql django

我想订购以下订单:

1
2
3
NULL
NULL

目前我有以下查询:

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

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

3 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

您可以使用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')

答案 2 :(得分:0)

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

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

然后数据库会处理它。

如果索引已经存在,您可以对其进行修改..如果您对直接SQL感到不舒服,也可以使用pgadmin ..右键单击索引并选择属性,您将在...中找到设置。 p>