条件时Oracle INNER JOIN

问题描述

我需要两个子查询(内部)连接到列(“ id”)上。不幸的是,我加入的某些值之前已经更改过,因此ON的{​​{1}}条件应该有条件地从两个条件中选择,具体取决于另一列的值(“鉴别器”)。一个简化的示例如下:

示例结果集查询1(q1)

INNER JOIN

示例结果集查询2(q2)

ID       DATA                DISCRIMINATOR
==========================================
1 1      Whatever            NULL
2AB      NULL                yes
4f-G     Could be anything   no
2CD      This one not        yes
2EEF     But this one        yes
11       And this            no
211      Last one            no

如果鉴别符为“是”,则q1中的ID可以通过在前面加上“ 2”并删除所有空白来更改,否则,它们是相同的。我仍然希望能够正确地联接表,并将q2中的ID保留在联接中。

预期的示例结果

ID       OTHERDATA     
====================
1 1      foo          
A B      bar               
EE F     foobar
G HH     barfoo
11       foofoo

我可以在ID DATA OTHERDATA ========================================== 1 1 Whatever foo 11 And this foofoo A B NULL bar EE F But this one foobar 条件下以某种方式进行CASE WHEN吗?我尝试了以下

ON

但是出现SELECT q2.id,q1.data,q2.otherdata FROM ((...somequery...) q1 INNER JOIN (...somequery...) q2 ON CASE WHEN discriminator = 'yes' THEN TRIM(q1.id) = CONCAT('2',REPLACE(RTRIM(q2.id),' ','')) ELSE q1.id = q2.id END ) ORDER BY id ; 错误。我无所事事,但在missing keyword条件下仍然无法正确使用CASE WHEN

我知道我可以使用ON来做类似的事情

UNION

但是这要求子查询执行两次,不是吗?我宁愿找到一种避免这种情况的方法。

是否可以在条件SELECT q2.id,q2.otherdata FROM ((...somequery...) q1 INNER JOIN (...somequery...) q2 ON q1.id = q2.id AND (discriminator <> 'yes' OR discriminator IS NULL) ) UNION SELECT q2.id,q2.otherdata FROM ((...somequery...) q1 INNER JOIN (...somequery...) q2 ON TRIM(q1.id) = CONCAT('2','')) AND discriminator = 'yes' ) ORDER BY id ; 中使用CASE WHEN子句中的INNER JOIN语句?还是还有另一种优雅的方式?

解决方法

是的,有可能:

SELECT q2.id,q1.data,q2.otherdata
FROM ((...somequery...) q1
      INNER JOIN
      (...somequery...) q2
      ON (CASE WHEN discriminator = 'yes' AND TRIM(q1.id) = CONCAT('2',REPLACE(RTRIM(q2.id),' ','')) THEN 1
             WHEN (discriminator <> 'yes' OR discriminator IS NULL) AND q1.id = q2.id THEN 1
      END) = 1
     )
ORDER BY id
;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...