代码之家  ›  专栏  ›  技术社区  ›  funnydman

为什么order by在数据库中有空值的杂项行为?

  •  1
  • funnydman  · 技术社区  · 6 年前

    ORDER_BY 如果价值是 null 例如,Postgres将这些值视为最大值。我想没有“正确”的行为,这取决于一个特定的案例。在SQLite上的一些测试开始失败之后,我发现了这个问题。

    例如:

    # Postgres
    >>> Person.objects.order_by('age').values('age')
    >>> <QuerySet [{'age': 10}, {'age': 30}, {'age': None}]>
    
    # SQLite
    >>> Person.objects.order_by('age').values('age')
    >>> <QuerySet [{'age': None}, {'age': 10}, {'age': 30}]>
    

    是否可以将所有数据库上的行为采用一种方式?顺便问一下,为什么行为上会有差异?

    1 回复  |  直到 6 年前
        1
  •  3
  •   funnydman    6 年前

    因为有 没有共识 数据库应该如何排序 NULL 价值观。

    您可以通过指定 无效的 应使用 F 对象,并调用 .asc(..) [Django-doc] .desc(..) [Django-doc] 在上面,设置 nulls_first=… nulls_last=… True . 例如:

    from django.db.models import F
    
    Person.objects.order_by(F('age').asc(nulls_last=True)).values('age')

    这将导致一个查询,它看起来像(SQLite):

    SELECT age
    FROM person
    ORDER BY age IS NULL, age;

    自从 False / 0 是以前订的 真的 / 1 ,它将因此命令 age 不是的 无效的 年龄 是谁 无效的 .

    Postgres中的同一个查询如下:

    SELECT age
    FROM person
    ORDER BY age ASC NULLS LAST;
    
    推荐文章