Postgres的DISTINCT函数是否总是返回null作为第一个元素?

时间:2016-04-15 07:02:47

标签: postgresql

我通过Java的JDBC连接器从表中选择不同的值,似乎NULL值(如果有的话)始终是ResultSet中的第一行。

我需要从我加载此ResultSet的List中删除此NULL。逻辑只查看第一个元素,如果它为null则忽略它。

我在查询中没有使用任何ORDER BY,我还能相信那个逻辑吗?我在Postgres的文档中找不到任何关于此的参考。

2 个答案:

答案 0 :(得分:2)

您可以添加NOT NULL检查。就像

一样
select distinct columnName 
from Tablename    
where columnName IS NOT NULL

此外,如果您没有提供ORDER BY子句,那么无法保证您将获得结果的顺序,因此您不能依赖它。因此,如果您希望在特定输出中输出结果(,即升序或降序),那么最好提供ORDER BY子句

如果您正在寻找reference Postgresql document,那么它会说:

  

如果未给出ORDER BY,则按行的顺序返回行   系统发现生产速度最快。

答案 1 :(得分:1)

如果手册中没有说明,我不会信任它。但是,只是为了好玩并尝试弄清楚正在使用什么逻辑,运行以下查询确实将NULL(没有明显的原因)带到顶部,而所有其他值都是明显的随机顺序:

with t(n) as (values (1),(2),(1),(3),(null),(8),(0)) 
select distinct * from t 

但是,将表与其自身的修改版本交叉连接会将两个NULL带到顶部,但随机NULL会分散到结果集中。所以它似乎没有一个明确的逻辑聚集在顶部的所有NULL值。

with t(n) as (values (1),(2),(1),(3),(null),(8),(0)) 
select distinct * from t 
cross join (select n+3 from t) t2