问题描述
我需要两个子查询(内部)连接到列(“ 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
;