2011-11-29 40 views
0

我有一個Postgres 9.0查詢返回的結果與此類似的方式:如何繁殖一行?

item;qty 
AAAA;2 
EEEE;3 

我想什麼是變換成:

AAAA 
AAAA 
EEEE 
EEEE 
EEEE 

有沒有什麼辦法可以做到這一點的簡單,即沒有存儲過程,函數等?

+1

[你嘗試過什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried/)除此之外...你的意思是說你已經擠滿'item'和'qty'成一個文本列?如果是這樣 - 不要這樣做。問題解決了一半。 –

+6

你會使用重複的值爲什麼?對於最終的問題,可能會有一個不那麼尷尬的解決方案... –

+0

我假設您在獲取數據之後使用某種表示層;因爲@djacobson說告訴我們你想要做什麼,所以給予像前端那樣「倍增」行的效果會更有意義。 –

回答

2

有一個函數'generate_series'可用於生成值的表。這些可以被用來通過加入重複列:

select item 
from data,generate_series(0,1000) 
where generate_series<qty order by item; 
0
SELECT 
    myTable.item 
FROM 
    myTable 
INNER JOIN 
    (SELECT 1 AS counter UNION ALL SELECT 2 UNION ALL SELECT 3) AS multiplier 
    ON multiplier.counter <= myTable.qty 

增加根據您的最大值工會在qty


但我也想關注@ djacobson的建議數:說明你爲什麼要做到這一點,因爲可能完全不同的方法。這樣做的感覺,嗯,奇怪...

+0

*使用這個與數量的思想不寒而慄> 5 * – NullUserException

+0

@NullUserException:呃,有很多方法創建一個順序的數字列表。更多的顫抖的想法是可以做這些結果:) – MatBailie

2

考慮以下演示:

CREATE TEMP TABLE x(item text, qty int); 

INSERT INTO x VALUES 
('AAAA',2) 
,('EEEE',3) 
,('IIII',4); 

SELECT regexp_split_to_table(rtrim(repeat(item||'~#~',qty),'~#~'),'~#~') AS item 
FROM x; 

正好產生所要求的結果。

  • 在我的測試中,它的執行速度比generate_series()的解決方案快一個數量級。
  • 額外獎金:與任意號碼qty
  • 缺點:您需要一個不包含在任何item中的分隔符字符串。