案例陈述缺少右括号

时间:2018-06-06 07:01:55

标签: sql oracle case case-when

我无法在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;

请建议..

2 个答案:

答案 0 :(得分:3)

有两种方法可以使用case表达式。

  1. 使用值:case x when a then b when c then d else e end
  2. 使用布尔表达式:case when x = a then b when x = c then d else e end
  3. 你不能混合这些。您已经获得了第一个表单,并且您正在尝试添加仅在第二种表单中运行的内容。首先将其转换为第二种形式。

答案 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上运行的内容。如果您获得所需的输出,则代码是否不同无关紧要。此外,如果原始代码无法运行,您别无选择。