如何乘以一排?

时间:2011-11-29 22:29:42

标签: sql postgresql

我有一个Postgres 9.0查询以类似于此的方式返回结果:

item;qty
AAAA;2
EEEE;3

我想要的是将其转化为:

AAAA
AAAA
EEEE
EEEE
EEEE

我有什么办法可以简单地做到这一点,即没有存储过程,函数等?

3 个答案:

答案 0 :(得分:2)

有一个'generate_series'函数可用于生成值表。这些可用于通过加入重复列:

select item 
from data,generate_series(0,1000) 
where generate_series<qty order by item; 

答案 1 :(得分: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中的分隔符字符串。

答案 2 :(得分: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

中的最大值增加UNIONS的数量


但我也会关注@ djacobson的建议:解释你为什么要这样做,因为这可能是一个完全不同的方法。这样做感觉,嗯,奇怪......