使用PL / SQL中的Case在单个Then子句下返回多个列

时间:2014-12-15 11:56:16

标签: sql oracle

我有一个case语句,我希望执行,但输出显示Missing Keyword。 请帮助我获得正确的输出。

CASE WHEN TRIM(STG.CLIENTCOUNTRY) in (select CPC_COUNTRY_CODE from ABC_DEVELOPER.EN_COUNTRY where COUNTRY_CODE='US')
        THEN
        (
    DECODE(COALESCE(scl.abc_do_not_solict_telemarktg_fl,scl.ov_do_not_solicit_telemktg_fla,scl.vigo_do_not_solicit_telemktg_f),'Y',DECODE(sbs.optout_flag,'N','Y',NULL),NULL) opt_in_phone_flag,
            DECODE(COALESCE(scl.abc_do_not_solict_telemarktg_fl,scl.ov_do_not_solicit_telemktg_fla,scl.vigo_do_not_solicit_telemktg_f),'Y',DECODE(sbs.optout_flag,'N',sbs.add_date,NULL),NULL) opt_in_phone_date,
            'Y' opt_out_sms_flag,
            sbs.add_date opt_out_sms_date,
            NULL opt_in_sms_flag,
            NULL opt_in_sms_date,
            DECODE(COALESCE(scl.abc_do_not_share,scl.ov_do_not_share,scl.vigo_do_not_share),'Y',DECODE(sbs.do_not_share,'Y','Y',NULL),NULL) opt_out_share_flag,
            DECODE(COALESCE(scl.abc_do_not_share,scl.ov_do_not_share,scl.vigo_do_not_share),'Y',DECODE(sbs.do_not_share,'Y',sbs.add_date,NULL),NULL) opt_out_share_date,

)
Else
(
   Existing Code
)

有一个结束案例陈述。但是这部分代码存在一定的错误。我想知道更多关于单个then子句下的多个语句的行。

2 个答案:

答案 0 :(得分:1)

CASE是一个可用于定义单个行/列的值的函数。您不能使用它来添加或删除结果集中的列。这不是SQL的工作原理。

要使其工作,您需要为需要实现它的每个列重复CASE逻辑。无论您是否打算使用它们,列都必须存在。在您希望忽略这些列的情况下,最好的解决方案就是将它们留给null

答案 1 :(得分:0)

"结束"声明丢失了 请查看官方文件

http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm

示例

SELECT cust_last_name,
   CASE credit_limit WHEN 100 THEN 'Low'
   WHEN 5000 THEN 'High'
   ELSE 'Medium' END
   FROM customers;

新修改

CASE 

WHEN TRIM(STG.CLIENTCOUNTRY) 
IN (SELECT CPC_COUNTRY_CODE FROM ABC_DEVELOPER.EN_COUNTRY WHERE COUNTRY_CODE='US')
THEN DECODE(COALESCE(scl.abc_do_not_solict_telemarktg_fl,scl.ov_do_not_solicit_telemktg_fla,scl.vigo_do_not_solicit_telemktg_f),'Y',DECODE(sbs.optout_flag,'N','Y',NULL),NULL)
ELSE 'existing code' opt_in_phone_flag,

WHEN TRIM(STG.CLIENTCOUNTRY) 
IN (SELECT CPC_COUNTRY_CODE FROM ABC_DEVELOPER.EN_COUNTRY WHERE COUNTRY_CODE='US')
THEN DECODE(COALESCE(scl.abc_do_not_solict_telemarktg_fl,scl.ov_do_not_solicit_telemktg_fla,scl.vigo_do_not_solicit_telemktg_f),'Y',DECODE(sbs.optout_flag,'N',sbs.add_date,NULL),NULL) 
ELSE 'existing code' opt_in_phone_date,
.
.
.
END