在oraclepl/sql中使用decode-in-loop语句

u0njafvf  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(349)

我想在oracle中使用decode-in-loop语句,但无法这样做。这是我的问题

for cur1 in
                    (
                         select distinct nvl(COVID_RISK_ZONE_NAME, 'No Data') "COVID_RISK_ZONE_NAME" from covid_daily_status
                    )
                    loop
                    VparaText:=VparaText||''''||cur1.COVID_RISK_ZONE_NAME||''' AS ' || '"'|| cur1.COVID_RISK_ZONE_NAME||'",';

                    VselectText:=VselectText||'x."'||cur1.COVID_RISK_ZONE_NAME||'"'|| ' AS ' || '"'||
decode(cur1.covid_risk_zone_name, 'No Classification' , 'Market Opened', 'No Data', 'No Info Avlbl' , cur1.covid_risk_zone_name)||'",';

                    end loop;

                select SUBSTR(VparaText, 1, LENGTH(VparaText) - 1) into VparaTemp from dual;  

                select SUBSTR(VselectText, 1, LENGTH(VselectText) - 1) into VSelectTemp from dual;

我得到这个错误:[error]pls-00204(195:106):pls-00204:函数或伪列“decode”只能在sql语句中使用
为什么我不能使用循环解码。

1zmg4dgp

1zmg4dgp1#

你可以用 case 而不是 decode() ,或使用 from dual 诡计。但归根结底,我不认为你需要一个游标和一个循环。使用字符串聚合可以获得所需的结果:

select
    listagg(
        ''''
            || covid_risk_zone_name 
            || ''' as "' 
            || covid_risk_zone_name 
            || '"', 
        ', '
    ) into VparaText,
    listagg(
        'x."' 
            || covid_risk_zone_name 
            || '" as "' 
            || decode(covid_risk_zone_name, 'No Classification' , 'Market Opened', 'No Data', 'No Info Avlbl' , covid_risk_zone_name) 
            || '"', 
        ', ') into VselectText
from (
    select distinct nvl(covid_risk_zone_name, 'No Data') covid_risk_zone_name 
    from covid_daily_status
) t

注意,子查询并不是绝对必要的(您可以使用 listagg(distinct ...) 相反,它避免了重复 nvl() 一次又一次的表达。

0vvn1miw

0vvn1miw2#

您需要将解码部分作为select into from dual的一部分。你可以试试
声明新变量 VselectTextNew ```
select VselectText ||'x."'|| cur1.COVID_RISK_ZONE_NAME||'"'|| ' AS ' || '"'|| decode(cur1.covid_risk_zone_name, 'No Classification' , 'Market Opened', 'No Data', 'No Info Avlbl' , cur1.covid_risk_zone_name)||'",'
into VselectTextNew from dual;

替换新变量的最后一部分
rta7y2nd

rta7y2nd3#

不幸的是解码不是一个真正的功能。它是一个表达式,不能在pl/sql中使用。仅在sql语句中。

rsaldnfx

rsaldnfx4#

非常感谢@gmb、@roberto hernandez和@akk0rd87的帮助。为了完成我的查询,我使用了@roberto hernandez技巧,但是他的查询必须被修改,因为它总是给我字符串中循环的最后一部分,因为“select vselecttext”总是重置我的字符串,所以必须修改它一点。

for cur1 in
                    (
                         select distinct nvl(COVID_RISK_ZONE_NAME, 'No Data') "COVID_RISK_ZONE_NAME" from covid_daily_status
                    )
                    loop
                    VparaText:=VparaText||''''||cur1.COVID_RISK_ZONE_NAME||''' AS ' || '"'|| cur1.COVID_RISK_ZONE_NAME||'",';

                    select VselectText ||'x."'|| cur1.COVID_RISK_ZONE_NAME||'"'|| ' AS ' || '"'||
                     decode(cur1.covid_risk_zone_name, 'No Classification' , 'Market Opened', 'No Data', 'No Info Avlbl' , cur1.covid_risk_zone_name)||'",' 
                    into VselectTextNew from dual;

                    vLong := vLong||VselectTextNew; --- Added new string.

                    end loop;

                select SUBSTR(VparaText, 1, LENGTH(VparaText) - 1) into VparaTemp from dual;  

                select SUBSTR(vLong, 1, LENGTH(vLong) - 1) into VSelectTemp from dual;

我还将尝试@gmb query,因为我在直接使用查询时遇到了一些问题。

相关问题