Postgresql奇怪的行为,当对null列的null / first / limit进行排序时

时间:2018-06-25 07:30:23

标签: sql postgresql

我在Postgresql上设置了以下数据:

create table data (
  id    int,
  stage varchar(255),
  name  varchar(255)
);

 id    stage      name  
 ----------------------------
 1   pyramid     act 1  
 2   pyramid     act 2  
 3   NULL        act 3  
 4   NULL        act 4  
 5   NULL        act 5  
 6   NULL        act 6  
 7   NULL        act 7  
 8   NULL        act 8  
 9   NULL        act 9  
 10  NULL        act 10 
 11  NULL        act 11 
 12  NULL        act 12 
 13  shangri la  act 13 

我查询所有数据表,并以空值last / limit分段:

select *
from data
order by stage asc nulls first
limit 5;

结果:

 id    stage      name  
 ----------------------------
 6     NULL       act 6 
 3     NULL       act 3 
 4     NULL       act 4 
 5     NULL       act 5 
 7     NULL       act 7 
 ----------------------------

更改极限值时出现不同的排序结果的问题:

select *
from data
order by stage asc nulls first
limit 3;

结果:

 id    stage      name  
 ----------------------------
 4     NULL       act 4 
 3     NULL       act 3 
 5     NULL       act 5 
 ----------------------------  

PS:我正在使用Postgresql PostgreSQL 10.3

1 个答案:

答案 0 :(得分:3)

这是标准行为。您在阶段列上仅排序 ,这意味着正在选择阶段列中具有相同值的任意行(并非始终以相同的方式解决联系) ,实际上Postgres不在乎它们,这就是为什么它会随机抽取行)

根据经验,除非您自己对输出进行明确排序,否则不会得到排序输出。

考虑以下示例,为您的数据添加id列。每次执行SELECT语句时,假定该列具有唯一值(在示例数据中,则如此),这将带来相同的行。为此,您可以在列id上定义主键或添加唯一约束。

select *
from data
order by stage asc nulls first, id
limit 3;

示例数据中的输出始终相同:

 id    stage      name  
 ----------------------------
 3     NULL       act 3
 4     NULL       act 4 
 5     NULL       act 5