选择中的 if 语句 (ORACLE)

Posted

技术标签:

【中文标题】选择中的 if 语句 (ORACLE)【英文标题】:If statement in select (ORACLE) 【发布时间】:2013-03-14 22:20:38 【问题描述】:

您好,我只是选择并且效果很好:

select 'CARAT Issue Open' issue_comment, i.issue_id, i.issue_status, i.issue_title, i.ISSUE_summary ,i.issue_description, i.severity,
gcrs.Area_name, gcrs.sector_name,

substr(gcrs.stream_name,1,case when instr(gcrs.stream_name,' (')=0 then 100 else instr(gcrs.stream_name,' (')-1 end) ISSUE_DIVISION,

case when gcrs.STREAM_NAME like 'NON-GT%' THEN 'NON-GT' ELSE gcrs.STREAM_NAME END as ISSUE_DIVISION_2


from table(f_carat_issues_as_of('31/MAR/2013')) i
inner join v_gcrs_with_stream gcrs on i.segment_id = gcrs.segment_id

where UPPER(ISSUE_STATUS) like '%OPEN%'

现在我想调用两列: ISSUE_DIVISION 和 ISSUE_DIVISION_2

如果它们在新列中相等则应为值 1 如果不相等则应为 0,

我该怎么做?


我的完整代码:

select 'CARAT Issue Open' issue_comment, i.issue_id, i.issue_status, i.issue_title, i.ISSUE_summary ,i.issue_description, i.severity,
gcrs.Area_name, gcrs.sector_name,

substr(gcrs.stream_name,1,case when instr(gcrs.stream_name,' (')=0 then 100 else instr(gcrs.stream_name,' (')-1 end) ISSUE_DIVISION,

case when gcrs.STREAM_NAME like 'NON-GT%' THEN 'NON-GT' ELSE gcrs.STREAM_NAME END as ISSUE_DIVISION_2


from table(f_carat_issues_as_of('31/MAR/2013')) i
inner join v_gcrs_with_stream gcrs on i.segment_id = gcrs.segment_id

where UPPER(ISSUE_STATUS) like '%OPEN%' and 

CASE WHEN ISSUE_DIVISION = ISSUE_DIVISION_2 THEN 
     CASE WHEN  ISSUE_DIVISION is null then "Null Value found"
     Else 1 End
ELSE 0 END As Issue_Division_Result

但我在线收到错误: ELSE 0 END 作为 Issue_Division_Result

ORA-00920: 无效的关系运算符 :(

【问题讨论】:

这将无法正确处理 GCRS.STREAM_NAME 的 NULL 值,因为在这种情况下 INSTR() 返回 NULL。 【参考方案1】:

如此简单,您可以在此处使用 case 语句。

CASE WHEN ISSUE_DIVISION = ISSUE_DIVISION_2 THEN 
         CASE WHEN  ISSUE_DIVISION is null then "Null Value found" //give your option
         Else 1 End
ELSE 0 END As Issue_Division_Result

【讨论】:

如果两个值都为 null 这将返回 0,这可能不是 OP 所期望/想要的(请参阅我对 OP 的评论)。【参考方案2】:
SELECT (CASE WHEN ISSUE_DIVISION = ISSUE_DIVISION_2 THEN 1 ELSE 0 END) AS ISSUES
    --  <add any columns to outer select from inner query> 
  FROM
 (  -- your query here --
   select 'CARAT Issue Open' issue_comment, ...., ..., 
          substr(gcrs.stream_name,1,case when instr(gcrs.stream_name,' (')=0 then 100 else  instr(gcrs.stream_name,' (')-1 end) ISSUE_DIVISION,
          case when gcrs.STREAM_NAME like 'NON-GT%' THEN 'NON-GT' ELSE gcrs.STREAM_NAME END as ISSUE_DIVISION_2
     from ....
    where UPPER(ISSUE_STATUS) like '%OPEN%'
 )
 WHERE... -- optional --

【讨论】:

这只是挽救了我的婚姻。谢谢。 有时 PL/SQL 试图摧毁任何人的婚姻!哈哈哈【参考方案3】:

使用该变量,Oracle 不支持在没有 INTO 的情况下使用 SQL。使用正确命名的变量,您的代码无论如何都会更清晰。

【讨论】:

【参考方案4】:

在一行中,答案如下;

[ CASE WHEN COLUMN_NAME = 'VALUE' THEN 'SHOW_THIS' ELSE 'SHOW_OTHER' END as ALIAS ]

【讨论】:

以上是关于选择中的 if 语句 (ORACLE)的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE If Then Else 语句与计数器和选择查询

Oracle流程控制语句

在 Oracle 存储过程中比较 IF 语句中的两列

Oracle中的多个选择语句

为 Oracle 更新查询 if 语句

Oracle之PL/SQL编程_流程控制语句