我想订购以下订单:
1
2
3
NULL
NULL
目前我有以下查询:
ItemInstance.objcts.filter(tv_series_id=item.pk).order_by('id')
这将按id ASC排序,但NULL将在开头。如何在不进行第二次查询的情况下将NULL推送到最后?
答案 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>