ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ для проверки идентификатора отношения несуществования

#mysql #sql

Вопрос:

У меня есть часть sql — запроса

 left outer join 
(
    select `id`,
        `order_payment_id`,
        `product_id`,
        `product_slug_id`,
        `order_package_id`,
        `name`,
        `price`
    from `web`.`order_products` `$Table`
) `$Inner` on (`$Outer`.`id2` = `$Inner`.`order_payment_id`)
 

Но проблема в том, что если

 $Outer`.`id2` is NULL
 

тогда мне нужно слияние, как

 `$Inner` on (`$Outer`.`order_payment_id` = `$Inner`.`order_payment_id`)
 

Итак, как написать правильный синтаксис для условия внутри ON ?
ожидаемый результат

 left outer join 
(
    select `id`,
        `order_payment_id`,
        `product_id`,
        `product_slug_id`,
        `order_package_id`,
        `name`,
        `price`
    from `web`.`order_products` `$Table`
) `$Inner` on ((IF ISNULL(`$Outer`.`id2`) THEN `$Outer`.`order_payment_id` ELSE `$Outer`.`id2`) = `$Inner`.`order_payment_id`)
 

Комментарии:

1. проверьте функцию IFNULL для mysql


Ответ №1:


Я бы выбрал функцию COALESCE, которая возвращает первое ненулевое значение:

 ) `$Inner` on COALESCE(`$Outer`.`id2`, `$Outer`.`order_payment_id`) = `$Inner`.`order_payment_id`)
 

Ответ №2:

Сделай этот трюк

 ) `$Inner` on (IFNULL(`$Outer`.`order_payment_id2`,`$Outer`.`id2`) = `$Inner`.`order_payment_id`)