我无法在case语句中只适合一个条件(在BOLD中):
Select pipeline_tx_status from pipeline, Consol
Where pipeline.pipeline_tx_status = case UPPER('&ps_status') when 'O' then 'O'
WHEN 'MFT' then 'MFT'
WHEN 'IS' then 'IS'
**WHEN (p_con.pipeline_tx_status in ('CNF') OR (p_con.pipeline_tx_status in('OI','ICF','C') AND NVL(MWB_HEADER.ACCOUNTING_STATUS,'O') NOT IN ('O'))) then 'CNF'**
WHEN 'OI' then 'OI'
WHEN 'ICF' then 'ICF'
WHEN 'C' then 'C'
End;
请建议..
答案 0 :(得分:3)
有两种方法可以使用case
表达式。
case x when a then b when c then d else e end
case when x = a then b when x = c then d else e end
你不能混合这些。您已经获得了第一个表单,并且您正在尝试添加仅在第二种表单中运行的内容。首先将其转换为第二种形式。
答案 1 :(得分:0)
在大多数情况下,您只需测试pipeline.pipeline_tx_status
和'ps_status
参数之间的相等性。因此,您可以将其重写为正常的WHERE条件。
Where (p_con.pipeline_tx_status = 'CNF'
and UPPER('&ps_status') = p_con.pipeline_tx_status)
or (p_con.pipeline_tx_status in('OI','ICF','C')
AND NVL(MWB_HEADER.ACCOUNTING_STATUS,'O') NOT = 'O'
and UPPER('&ps_status') = 'CNF' )
or pipeline.pipeline_tx_status = UPPER('&ps_status')
在评论中你说:
“在一个正在运行的BI工具中,我必须在SQL开发人员中编写相同的内容”
BI工具未针对Oracle运行,或BI工具采用伪SQL并将其转换为有效(即可编译)SQL。但是,无论你如何反弹CASE语句都不会在Oracle上运行。因此,您的任务是将BI工具的逻辑转换为可在Oracle上运行的内容。如果您获得所需的输出,则代码是否不同无关紧要。此外,如果原始代码无法运行,您别无选择。