在游标中使用别名解码

时间:2014-11-27 08:08:33

标签: plsql

我想在带有别名的游标中使用解码函数以避免列模糊,所以我使用了以下方法。

我的代码如下:

 declare
     cl number;
     cursor c is 
        select c1.rowid,c1.col1,
               DECODE(c1.col2, 'XYZ', c1.col3, 10) cl 
          from table1 d,table2 c1 where c1.process_id=13525 and d.col3(+)=cl;
begin
  for rec in c
  loop
    dbms_output.put_line(NVL(rec.cl,'-1'));
  end loop;
end;

在此,当我通过删除条件'和d.col3(+)= cl'来触发查询时,它将检索值为'cl'的数据。但是当我分配这个条件时,它不会检索数据而不会进入游标循环。我在d.col3中有匹配的数据。

假设我是否会得到cl为5然后它也存在于d.col3然后它应该给我数据我这样做因为我需要删除重复记录。因为有这个单一条件我将得到重复记录。这是col3在d表中作为主键。

所以我不明白为什么它不会进入循环,因为它从查询中获取值。

2 个答案:

答案 0 :(得分:1)

您无法在WHERE子句中使用别名:Using an Alias in a WHERE clause

在这种情况下,子查询或CTE可能有所帮助。 喜欢的东西(未经测试!):

with V as (
  select c1.rowid rid, ,c1.col1, c1.process_id,
         DECODE(c1.col2, 'XYZ', c1.col3, 10) cl 
    from table2 c1)

select V.rid, V.col1, V.cl from table1 d,V 
  where V.process_id=13525 and d.col3(+)=V.cl;

答案 1 :(得分:0)

在得到使用WITH子句的建议后,我使用替代表名通过DECODE()检索数据的方法是:

  declare
     cl number;
     cursor c is 
        with V as (
           select c1.process_id,
                  DECODE(c1.col2, 'BANDM', c1.col3, 10) cl 
             from table2 c1)
           select c1.rowid rid,c1.col1, V.cl from table1 d,V,table2 c1
            where V.process_id=1 
              and d.col3(+)=V.cl 
              and c1.col3=V.cl;

  begin
    for rec in c
    loop
     dbms_output.put_line(NVL(rec.rid,'-1'));
     dbms_output.put_line(NVL(rec.cl,'-1'));
    end loop;
  end;

没有WITH子句的另一个解决方案是:

  declare
     c2 number;
     cursor c is 
          select c1.process_id
                 c1.rowid,
                 c1.col1,
                 DECODE(c1.col2, 'BANDM', c1.col3, 10) as c2
            from table1 d,
                 table2 c1
           where c1.process_id=1 
             and d.col3(+) = DECODE(c1.col2, 'BANDM', c1.col3, 10);

  begin
    for rec in c
    loop
     dbms_output.put_line(NVL(rec.rid,'-1'));
     dbms_output.put_line(NVL(rec.c2,'-1'));
    end loop;
  end;