即使现在是2017年,关于NULL
s是否应优先考虑仍未达成共识。如果没有明确说明,结果将取决于DBMS。
该标准没有指定与非NULL值相比应如何对NULL进行排序,只是将任何两个NULL视为均等排序,并且NULL应该在所有非NULL值之上或之下排序。
资料,大多数DBMS的比较
为了说明这个问题,我列出了一些有关Rails开发的最受欢迎的案例:
PostgreSQL的
NULL
的值最高。
默认情况下,空值的排序似乎大于任何非空值。
来源:PostgreSQL文档
的MySQL
NULL
的值最低。
在执行ORDER BY时,如果执行ORDER BY ... ASC,则将首先显示NULL值;如果执行ORDER BY ... DESC,则将显示NULL值。
来源:MySQL文档
SQLite的
NULL
的值最低。
具有NULL值的行以升序高于具有常规值的行,并且以降序相反。
资源
解
不幸的是,Rails本身还没有提供解决方案。
特定于PostgreSQL
对于PostgreSQL,您可以非常直观地使用:
Photo.order('collection_id DESC NULLS LAST') # NULLs come last
特定于MySQL
对于MySQL,您可以将减号放在前面,但是此功能似乎尚未记录。似乎不仅适用于数值,而且适用于日期。
Photo.order('-collection_id DESC') # NULLs come last
特定于PostgreSQL和MySQL
为了涵盖这两个方面,这似乎可行:
Photo.order('collection_id IS NULL, collection_id DESC') # NULLs come last
不过,这一点在SQLite中不起作用。
通用解决方案
要为所有DBMS提供交叉支持,您必须使用CASE
@PhilIT建议的编写查询:
Photo.order('CASE WHEN collection_id IS NULL THEN 1 ELSE 0 END, collection_id')
转换为首先对每个记录进行排序CASE
(首先按结果排序(默认为升序,这意味着NULL
值将是最后一个)),其次按calculation_id
。