在 PostgreSQL 中对 NULL 值进行排序

Sorting NULL values in PostgreSQL

在 PostgreSQL 中,我在各种类型的列上使用 ORDER BYNUMERICTEXTBOOLEANTEXT[])。我正在设计一个 AJAX GUI,用户可以在其中按各个列交互式地对记录进行排序(按升序和降序排列,在 table 标题中使用熟悉的 ▲▼ 符号)。

问题是某些行包含 NULL 值。一般来说,只有少数这样的行 (100/10000),它们主要包含错误数据,我不愿意隐藏这些数据,但也不想显示太多。我想要的是 NULL 值在使用 ORDER BY 时总是落在列表的末尾(用户只会在她导航到分页的最后一页时看到它们),无论顺序是降序或升序。

对于数字属性,例如,我发现 NULL 值似乎被认为是最大的,因此在降序排序时出现在列表的顶部。这正是我不想要的。

我带来了一个丑陋的 hack,我不好意思展示,但会完成工作(在 python 中):

"COALESCE(value, '%sINFINITY')" % ('-' if sort_order == 'descending' else '')

如果它足够通用,我会在我的代码中保留这个丑陋的家伙。但显然不是。它适用于整数、双精度和时间戳,但不适用于文本、布尔值等。仅仅是因为没有(至少我还没有找到)大于所有其他字符串的最大字符串常量,例如无穷大是所有数字中最大的。事实上,我可以将 'ZZZZZ' 放入代码中,但这显然非常不卫生,所以我决定在这里问 :)

有没有其他优雅的方式来做我想做的事?

使用:

select ...
from ...
order by the_column nulls last;

看看documentation