我在表A上有一个非常复杂的请求,其中在另一个表B和C(实际上还有更多)上进行了self.data = self.spark.read.csv(path=self.input_file,header=True, schema=self.schema)
。
我希望在表A中某个字段的特定值上,将字段添加到JOIN
中,但还要添加不同的联接。
我知道我可以使用SELECT
动态添加列,但是测试值始终相同,并且我想避免对每个字段重复使用CASE
,因为有很多字段。 (为清楚起见,我在CASE
中将表分别命名为“ B”和“ D”,但在实际情况下,使用连接别名可能是相同的。)
CASE
有没有一种解决方案可以动态加入,并避免长时间SELECT
CASE
WHEN A.a1=1 THEN B.b1
WHEN A.a1=2 THEN D.d1
END AS a2,
CASE
WHEN A.a1=1 THEN B.b2
WHEN A.a1=2 THEN D.d2
END AS a3,
CASE
WHEN A.a1=1 THEN B.b2
WHEN A.a1=2 THEN D.d2
END AS a3,
//... many others on different tables but always on the same condition
FROM A
JOIN //?? if first condition join on B and C else on D and E
重复通话?
注意:这只是使用代码构建的查询的一部分,这使得使用CASE
变得困难,因为字段被添加到其他位置,并且很难匹配相同数量的所选字段。
答案 0 :(得分:1)
您可以在当前LEFT JOIN
条件下使用所有CASE
作为ON
的一部分,然后COALESCE
这些表的值。像这样:
SELECT COALESCE(B.b1,D.d1) AS a2,
COALESCE(B.b2,D.d2) AS a3,
COALESCE(B.b3,D.d3) AS a4,
...
FROM A
LEFT JOIN B ON {normal_join_condition} AND A.a1 = 1
LEFT JOIN C ON {normal_join_condition} AND A.a1 = 1
LEFT JOIN D ON {normal_join_condition} AND A.a1 = 2
LEFT JOIN E ON {normal_join_condition} AND A.a1 = 2