3

誰かが以下のクエリの何が問題になっているのか教えてもらえますか?

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;

私の期待する結果は次のようになります。

  • studydomainmetadataidが0未満の場合はCD1
  • studydomainmetadataid> 0(i、e 85)の場合はCD
  • ANALYSISCODEがnullでない場合は「xxx」

nullのANALYSISCODEを取得しています。

4

1 に答える 1

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私の推測は正しく、クエリはデータをまったく返さないため、null 値になります。

返されたレコードがない場合、CASEステートメントはクエリによって返されたレコードに対してのみ機能し、CASE実行されません。

それが役に立てば幸い...

于 2012-07-31T08:53:55.697 に答える