table2.A = 1 for display only
table2.B = 2 for display only
SELECT * FROM table1
INNER JOIN table2 ON
IF(A > B)
table2.id = table1.id -- if value of A is > B then inner join table on table2.id = table1.id
ELSE IF (A < B)
table2.id = table1.somethingElse -- if value of A is < B then inner join table on table2.id = table1.somethingElse
如何将其转换为实际的SQL?
答案 0 :(得分:3)
在AND
子句中使用OR
/ ON
逻辑:
SELECT *
FROM table1 t1
INNER JOIN table2 t2
ON (t2.A > t2.B AND t1.id = t2.id) OR
(t2.A < t2.B AND t1.somethingElse = t2.id);
请注意,您期望的逻辑会留下一个A = B
恰好处于边缘情况。假设您要包括此内容,一种方法是将不等式之一更改为>=
或<=
。
答案 1 :(得分:1)
您可以使用CASE表达式:
SELECT *
FROM table1
INNER JOIN table2 ON table2.id = CASE
WHEN (A > B) THEN table1.id
WHEN (A < B) THEN table1.somethingElse
END
请注意,此查询仍然可以使用table2(id)
上的索引。
还可以使用嵌套的IF()
函数:
SELECT *
FROM table1
INNER JOIN table2 ON
table2.id = IF(A > B, table1.id, IF(A < B, table1.somethingElse, NULL))
但这不是很可读。
还请注意,如果A = B
,则两个查询都将不匹配。但这就是您的“伪代码”所建议的。
答案 2 :(得分:0)
我不确定我是否完全了解您的需求。但是可能是这样的。在PostgreSQL中。
SELECT *
FROM
table1
INNER JOIN table2 ON
CASE WHEN table1.A > table2.B THEN table1.id = table2.id
ELSE table1.id = table2.id2
END;