2015-11-11 75 views
1

簡單的問題。我有一個包含3行的表格「tablename」。我需要表現出我的選擇,當數列< 5.Postgresql select,顯示固定計數行

select * from tablename 


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

5列在此查詢我顯示錶中的所有行。 但我需要顯示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中的值始終是連續的並且沒有間隙(這是極不可能的),那麼您可以使用row_number()刪除第二個CTE中行號的生成。

如果你不關心哪個返回行,你可以離開了order by部分 - 但那麼匹配的行會隨機。離開order by會更有效率。


無論tablename包含多少行,以上將始終返回5行。如果你想至少 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