2015-11-11 2 views
1

Простой вопрос. У меня есть таблица «tablename» с 3 строками. Мне нужно показать 5 строк в моих отборных, когда количества строк < 5.Postgresql select, show fixed count rows

select * from tablename 


+------------------+ 
|colname1 |colname2| 
+---------+--------+ 
|1  |AAA  | 
|2  |BBB  | 
|3  |CCC  | 
+---------+--------+ 

В этом запросе я показать все строки в таблице. Но мне нужно показать 5 строк. 2 строки пустые. Например (мне нужно):

+------------------+ 
|colname1 |colname2| 
+---------+--------+ 
|1  |AAA  | 
|2  |BBB  | 
|3  |CCC  | 
|   |  | 
|   |  | 
+---------+--------+  

Последние 2 строки пуст. Возможно?

+1

Что делать, если у вас есть более чем 5 строк в таблице? –

+0

Я думаю, что это будет намного проще обрабатывать в вашем прикладном уровне. Какой язык вы используете, или это чистая проблема с DBA? –

+0

Спасибо, все! Мне нужна полезная информация. –

ответ

2

Нечто подобное:

with num_rows (rn) as (
    select i 
    from generate_series(1,5) i -- adjust here the desired number of rows 
), numbered_table as (
    select colname1, 
      colname2, 
      row_number() over (order by colname1) as rn 
    from tablename 
) 
select t.colname1, t.colname2 
from num_rows r 
    left outer join numbered_table t on r.rn = t.rn; 

Это присваивает номер для каждой строки в tablename и присоединяется, что для фиксированного числа строк. Если вы знаете, что ваши значения в colname1 всегда являются последовательными и без пробелов (что маловероятно), вы можете удалить генерацию номеров строк во втором CTE с помощью row_number().

Если вы не заботитесь , которые возвращаются строки, вы можете оставить из order by части - но строки, которые совпадающие будут случайным. Оставляя order by будет немного более эффективным.


выше всегда будет возвращать ровно 5 строк, независимо от того, сколько строк tablename содержит. Если вы хотите по крайней мере 5 строк, то вам нужно переворачивать внешнее соединение:

.... 
select t.colname1, t.colname2 
from numbered_table t 
    left outer join num_rows r on r.rn = t.rn; 

SQLFiddle пример: http://sqlfiddle.com/#!15/e5770/3