INNER JOIN ON IF语句结果

时间:2019-04-02 15:40:33

标签: mysql sql

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?

3 个答案:

答案 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;