2011-11-29 37 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中的分隔符字符串。