在 PostgreSQL 中对特殊情况的值进行排序
本讨论围绕排列名为“tasks”的 PostgreSQL 表中的数据进行。每个任务都有一个称为“排序”的可选字段。目标是将没有“排序”值的排序任务优先于所有其他任务,但那些以“-1”作为排序值的任务除外,它应该出现在所有其他任务之后。
考虑以下示例数据:
id | f_id | name | sort |
---|---|---|---|
1 | 1 | zeta | -1 |
2 | 1 | alpha | 1 |
3 | 1 | gamma | 3 |
4 | 1 | beta | 2 |
5 | 1 | delta | |
6 | 1 | epsilon |
单独使用 COALESCE(sort,99999) 会将空值分组在非空值之后,但它不会解决以下特殊情况"-1."
该解决方案采用 PostgreSQL 的布尔数据类型来实现所需的排序顺序:
SELECT * FROM tasks ORDER BY (sort IS NOT DISTINCT FROM -1), sort;
此查询利用了比较“(sort IS NOT DISTINCT”这一事实FROM -1)”对于除“-1”之外的所有值均求值为 FALSE,“-1”本身求值为 TRUE。通过首先按此表达式排序,“-1”值将放置在顺序的末尾,无论其排序值如何。
还提供了使用 DESC 关键字的替代方法:
SELECT * FROM tasks ORDER BY (sort IS DISTINCT FROM -1) DESC, sort;
这两种方法都可以有效地对没有“排序”值的任务进行排序,同时确保“-1”值出现在所有其他非空排序值之后。
以上是如何对包含 Null 和特殊情况 (-1) 值的 PostgreSQL 数据进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!