Странное поведение Postgresql при сортировке пустого столбца с нулевыми значениями first / limit - PullRequest
0 голосов
/ 25 июня 2018

У меня есть следующие данные на 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 голосов
/ 25 июня 2018

Это стандартное поведение. Вы сортируете only в столбце stage, что означает, что произвольные строки с одинаковым значением в столбце stage выбираются (связи не разрешаются все время одинаковым образом, в На самом деле 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...