如何在postgresql中使用参数列名值?

时间:2017-04-14 12:11:43

标签: postgresql dynamic

我有一个问题,我们需要根据不同的开始和结束日期计算一些变量,这些变量可以根据客户端进行更改。

目前,我已实施此解决方案如下: -

例如:

创建一个静态表:ref_table
   列:training_start_date,training_end_date
   值:ISB_START_DT和ISB_END_DT
   即1排。    如果另一个客户想要使用其他日期,则创建此表,    值可以更改为
   值:CS_START_DT和CS_END_DT
   或任何东西    注意:此表一次只包含1行        使用的查询:

   create table ref_table(training_start_date varchar(30), training_end_date 
   varchar(30); 
   insert into ref_table values('ISB_START_DT','ISB_END_DT')

现在,还有另一个sql查询,我们使用这个表并使用它来计算功能,在该查询中也有很多列和功能,但我给出了一个示例代码。

Sample Code:

   Create or replace view prm_vw as  
   select s2.*,
          case 
          when NewValue < 0 then null
          else NewValue end as NewValue1
         from (
               select 
                     s1.*,
                     case 
                         when training_start_date  = 'ISB_START_DT' and 
                         training_start_date = 'ISB_END_DT' 
                         then ISB_START_DT - ISB_END_DT 
                         when training_start_date  = 'CS_START_DT' and 
                         training_start_date = 'CS_END_DT' 
                         then CS_START_DT - CS_END_DT 
                     end as NewValue
                from (
                     select 
                     AVG(date_to_calculate) OVER (PARTITION BY country) AS 
                     ISB_START_DT, 
                     AVG(date_to_calculate) OVER (PARTITION BY REGION) AS 
                     CS_START_DT,
                     ISB_END_DT,
                     CS_END_DT
                     ref.*
                     from prm_cmop
                     cross join 
                     ref_table ref
                 )s1
            )s2 

我已经通过上述方式实现了这一点,但我觉得这不是优化的方式,因为我仍在努力编码并检查training_start_date =&#39; ISB_START_DT&#39;因为我不能直接将代码作为
ISB_START_DT - ISB_END_DT由于NewValue为training_start_date - training_end_date,因为training_start_date包含列名ISB_START_DT,我对ISB_START_DT的列值感兴趣。此外,如果将来客户希望我们使用另一列,那么我必须再次更改我的视图脚本以包含在行的情况下。

请有人帮我解释实现这一目标的最佳方法。

0 个答案:

没有答案