首页 > 解决方案 > 在连接条件中使用时语句在 oracle 中不起作用的情况

问题描述

在sql中的join语句上我需要用例。我试过了,但我收到错误:

Missing expression:ORA-00905

我试过这个查询:

SELECT * 
FROM   abc a 
       LEFT JOIN (SELECT * 
                  FROM   anil_groups 
                  WHERE  datatype = 'C' 
                         AND payor = 'SELECT') gr 
              ON CASE 
                   WHEN Upper(a.sourcefilename) LIKE '%RIO%' THEN 
                   gr.sourceid = 'SH_Rio_Tinto' 
                   ELSE gr.sourceid = 'SH_Albertson' 
                 END 
       LEFT JOIN (SELECT * 
                  FROM   tbl_danger 
                  WHERE  source = 'KK') spec 
              ON Upper(a.rollupid) = spec.code; 

标签: sqloracleoracle12c

解决方案


它在 oracle 中不起作用。CASE WHEN 是一个提供非布尔值的构造,因此您必须使用它来运行您的布尔测试(Upper(a.sourcefilename) LIKE '%RIO%')并让它产生您想要比较的字符串值gr.sourceid

ON gr.sourceid = CASE 
                   WHEN Upper(a.sourcefilename) LIKE '%RIO%' THEN 
                    'SH_Rio_Tinto' 
                   ELSE 'SH_Albertson' 
                 END 

您还可以重写您的联接以不使用它:

ON (gr.sourceid = 'SH_Rio_Tinto' AND Upper(a.sourcefilename) LIKE '%RIO%') OR
   (gr.sourceid = 'SH_Albertson' AND Upper(a.sourcefilename) NOT LIKE '%RIO%') 

推荐阅读