Oracle CASE表达式混乱

时间:2012-07-30 11:22:45

标签: sql oracle

有人能告诉我下面的查询有什么问题吗?

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小于0
  • CD如果studydomainmetadataid&gt; 0(i,e 85)
  • 'xxx'如果ANALYSISCODE不为空

我得到的是来自ANALYSISCODE。

1 个答案:

答案 0 :(得分: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不会被执行。

希望它有所帮助...