INNER ПРИСОЕДИНЯЙТЕСЬ К ЕСЛИ РЕЗУЛЬТАТЫ - PullRequest
0 голосов
/ 02 апреля 2019
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 ]

3 голосов
/ 02 апреля 2019

Использование логики 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 голос
/ 02 апреля 2019

Вы можете сделать это с помощью выражения 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. Но это то, что предлагает ваш «псевдокод».

0 голосов
/ 02 апреля 2019

Я не уверен, что понимаю, что именно вам нужно.Но, наверное, как-то так.Это в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...