LEFT OUTER JOIN的ON子句根据外部字段空值动态匹配关联ID的写法
正确SQL实现方案
方案1:使用SQL标准函数COALESCE(兼容性最优,推荐)
COALESCE是ANSI 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 COALESCE(`$Outer`.`id2`, `$Outer`.`order_payment_id`) = `$Inner`.`order_payment_id`
逻辑说明:COALESCE会返回参数列表中第一个非NULL的值,当$Outer.id2不为空时就用它关联,为空时自动切换为用$Outer.order_payment_id关联。
方案2:使用标准CASE WHEN语法(可读性强,支持复杂扩展)
如果后续需要新增更多判断逻辑,可以用同样是SQL标准的CASE WHEN写法,可读性更高:
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 ( CASE WHEN `$Outer`.`id2` IS NULL THEN `$Outer`.`order_payment_id` ELSE `$Outer`.`id2` END = `$Inner`.`order_payment_id` )
方案3:MySQL专属IF函数写法
如果你只在MySQL环境下运行,也可以用MySQL原生的IF函数实现:
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(`$Outer`.`id2` IS NULL, `$Outer`.`order_payment_id`, `$Outer`.`id2`) = `$Inner`.`order_payment_id`
内容的提问来源于stack exchange,提问作者Dmitrij Holkin
相关产品推荐
相关产品推荐

