选择中的 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)的主要内容,如果未能解决你的问题,请参考以下文章