我想在带有别名的游标中使用解码函数以避免列模糊,所以我使用了以下方法。
我的代码如下:
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表中作为主键。
所以我不明白为什么它不会进入循环,因为它从查询中获取值。
答案 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;