2012-07-30 62 views
3

任何人都可以告诉我下面的查询有什么问题吗?Oracle CASE表达式混淆

select case 
     when ANALYSISCODE is null and 
       studydomainmdata.studydomainmetadataid > 0 
      then 'CD' 
     when ANALYSISCODE is null and 
       studydomainmdata.studydomainmetadataid < 0 
      then 'CD1' 
     when analysiscode is not null 
      then ANALYSISCODE 
     else 'N/A' 
     end as ANALYSISCODE 
from studyanalysis 
inner join (slmetadata 
       inner join studydomainmdata 
       on slmetadata.slmetadataid = studydomainmdata.slmetadataid and 
        studydomainmdata.studydomainmetadataid=-9) 
    on studyanalysis.analysisid = slmetadata.analysisid; 

我的预期的结果将是:

  • CD1如果studydomainmetadataid是如果studydomainmetadataid> 0
  • 'XXX' 如果ANALYSISCODE是不小于0
  • CD(I,E 85) null

我得到空ANALYSISCODE。

+0

欢迎来到StackOverflow。请在下次使用更具描述性的标题并使用'{}'按钮来设置代码的格式。 – Codo 2012-07-30 11:30:30

+0

并显示您收到的任何错误;如果得到错误的结果而不是错误,表结构,样本数据和预期输出。 – 2012-07-30 11:50:07

+0

如果ANALYSISCODE为null,并且studydomainmdata.studydomainmetadataid = 0,则您的查询将返回null – 2012-07-30 12:09:04

回答

1

我猜你的查询没有返回任何东西,因此CASE没有被测试,你没有得到任何结果返回(甚至没有你的ELSE默认值)。

为了验证这一猜测,包你用SELECT COUNT(*) FROM像这样的查询:

SELECT count(*) FROM 
(
select case   
     when ANALYSISCODE is null and studydomainmdata.studydomainmetadataid > 0 
     then 'CD' 
     when ANALYSISCODE is null and studydomainmdata.studydomainmetadataid < 0 
     then 'CD1' 
     when analysiscode is not null 
     then ANALYSISCODE 
     else 'N/A' 
     end as ANALYSISCODE 
    from studyanalysis 
inner join (slmetadata 
      inner join studydomainmdata 
        on slmetadata.slmetadataid = studydomainmdata.slmetadataid 
        and studydomainmdata.studydomainmetadataid=-9) 
    on studyanalysis.analysisid = slmetadata.analysisid 
) 

如果count(*)回报0然后我的猜测是正确的,你的查询并不返回任何数据,因此空值。

CASE语句只能对查询返回的记录起作用,如果没有重新记录的记录,则不执行CASE

希望它有帮助...