Alternatives to CASE in Oracle 8i [duplicate]

我的梦境 提交于 2019-12-13 08:48:27

问题


Thanks to the stackoverflow community I found out that this query is not supported in Oracle 8i because of the CASE WHEN.

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');

What are the alternatives for this query to run on Oracle 8i?

Thanks in advance!


回答1:


You should try with 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 to the documentation of decode.

However, as has been pointed out in a comment, the join construct (ansi joins) won't work in 8i either.




回答2:


instead of (case when seqnum = 1 then '1' when seqnum = cnt then '0' end) you could use decode(seqnum, 1, '1', decode(seqnum, cnt, '0'))

I hope you get the idea



来源:https://stackoverflow.com/questions/21773779/alternatives-to-case-in-oracle-8i

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!