Oracle 8i中CASE的替代方案

时间:2014-02-14 08:00:50

标签: oracle oracle8i

感谢stackoverflow社区,我发现由于CASE WHEN,Oracle 8i不支持此查询。

select (case
         when seqnum = 1 then
          '1'
         when seqnum = cnt then
          '0'
       end) as value1,
       (case
         when seqnum = 1 then
          t.BEGIN_DT
         when seqnum = cnt then
          t.END_DT
       end) as TIME1,      
       t4.UNIT1 || '.SUBBATCH_TRIGGER' TAG     
  from (select t.*,
               row_number() over(partition by t.BATCH_ID, t.plant_unit, t3.ID2 order by t.BEGIN_DT) as seqnum,
               count(*) over(partition by t.BATCH_ID, t.plant_unit, t3.ID2) as cnt
          from SCH2.tb_pg_unit_stap t
join (select ID1,batch_id from SCH2.VW_BATCH) t2 on t.BATCH_ID = t2.BATCH_ID
join (select ID2,ID1 from SCH1.STEP) t3 on t3.ID1 = t2.ID1) t
join SCH2.TB_W_MACHINE t4 on t4.plant_unit = t.plant_unit
where (seqnum = 1
    or seqnum = cnt) AND (t.BEGIN_DT > '01-jan-2013' AND t.BEGIN_DT < '01-feb-2013');

此查询在Oracle 8i上运行的替代方法是什么?

提前致谢!

2 个答案:

答案 0 :(得分:5)

您应该尝试使用decode(..., ..., ...)

select
  decode(seqnum,
            1  , '1',
            cnt, '0'
        ) as                   value1,
  decode(seqnum,
            1  , t.BEGIN_DT,
            cnt, t.END_DT
  ) as                         TIME1
  ...

here's the link到解码文档。

但是,正如评论中指出的那样,join构造( ansi join )也不会在8i中起作用。

答案 1 :(得分:2)

而不是(case when seqnum = 1 then '1' when seqnum = cnt then '0' end) 你可以使用decode(seqnum, 1, '1', decode(seqnum, cnt, '0'))

我希望你明白这个想法