我正在维护一个旧系统,其中未正确创建表的结构和设计。我知道这是一个丑陋的"情况,但我需要处理它。
我有一个包含多个字段的表TABLEA。其中两个代表MODEL(MODEL1和MODEL2)。根据状态(STATUS),MODEL1和MODEL2具有以下值:
我需要执行一个查询,我将TABLEA与模型上的另一个表TABLEB连接起来。根据状态,我需要使用非空模型字段连接表。
我可以通过连接MODEL1和MODEL2解决它:
SELECT *
FROM TABLEA A INNER JOIN TABLEB B
ON (A.MODEL1 || A.MODEL2) = B.MODEL;
但我想知道是否有一种优雅的方式来使用IF条件。 欢迎任何其他解决方案。
答案 0 :(得分:1)
你可以像这样使用union:
select *
from tablea a
inner join tableb b
on a.model1 = b.model and a.status = 'A'
union all
select *
from tablea a
inner join tableb b
on a.model2 = b.model and a.status <> 'A'
答案 1 :(得分:0)
我更喜欢jmarkmurphy的解决方案,但这是另一种选择,使用左连接。
SELECT CASE WHEN b1.col1 = '' THEN b2.col1 ELSE b1.col1 END ......
FROM tablea a
LEFT JOIN tableb b1
ON a.model1 = b1.model
LEFT JOIN tableb b2
ON a.model2 = b2.model
但是,如果可能的话,架构中的变化是最佳选择:
添加一个新的a.model列,其中包含model1和model2的所有非空值,并加入其中。
使用物化视图,如:
选择a。*,例如a.model1 =&#39;&#39;那么a.model2 ELSE a.model1 END AS模型
FROM tablea a
如果a.model1或a.model2上没有可以提高查询性能的索引,则可以将上一个视图用作非物质化的,可能是内联的视图。