在具有计算值的选择查询中生成动态系列

时间:2015-07-24 03:03:44

标签: sql postgresql

背景:

基于该值的观察系数,值会产生新的值。

e.g。值 A 会在用户点击某个按钮创建时创建新的值 A-1,A-2,A-3 ,但在此之前,我需要提供他们预览。

问题:

如果我最初有这张表:

id  | value | observation
-----------------------------------------------
 1  | A     | 3
-----------------------------------------------
 2  | B     | 2

我希望根据观察值(确认前的预览)显示要添加的计算新值集,如下所示:

id   | value | new value to be created | observation
-----------------------------------------------
1    | A     | A-1                     |   3
-----------------------------------------------
1    | A     | A-2                     |   3
-----------------------------------------------
1    | A     | A-3                     |   3

这就像将表连接到另一个包含计算值的表而没有实际的表/关系。

我的想法是:

  1. 创建一个临时表,其中计算值为,然后进行连接(但是如果行数太大,每次插入批次会很昂贵)

  2. 我已尝试将计算值作为数组聚合,但我需要它们在不同的行中,如我所显示的第二个表。

  3. 我该怎么做?或者这甚至可能吗?

2 个答案:

答案 0 :(得分:1)

看一下generate_series函数,试试这个:

select 
    t.id, 
    t.value, 
    CASE 
      WHEN t.observation = 0 OR t.observation IS NULL THEN
        NULL
    ELSE 
        t.value || '-' || series.n
    END 
    as "new value to be created",
    t.observation
from 
    (select 
       s.n 
     from 
       generate_series(1,(select max(observation) from tableName)) as s(n)
    ) as series
cross join
   tableName as t  
where
   ((t.observation = 0 OR t.observation IS NULL) AND series.n = 1)
   OR 
   (series.n <= t.observation)
order by 
   t.value, 
   series.n

答案 1 :(得分:0)

这里SQL对你有用。

select id, value,value ||'-'|| number as "new value to be created" ,observation
from (
select 1 as number
union
select 2  
union
select 3 
union
select 4) as t, context  where t.number <= observation 

这里动态生成数字SQL

select id, value,value ||'-'|| generate_series as "new value to be created" ,
observation
from (
select * from generate_series(1, 20)) as t, context  where t.generate_series <= observation 

Here SQL Fiddle

谢谢。