如何实现条件LEFT JOIN:优先关联delivery_address_id,NULL时关联invoice_address_id
解决LEFT JOIN优先关联配送地址、空值时关联发票地址的问题
直接用CASE WHEN在JOIN的关联条件里动态选择关联字段就能实现需求,同时避免使用OR带来的重复匹配问题:
SELECT o.*, a.* FROM orders o LEFT JOIN addresses a ON a.id = CASE WHEN o.delivery_address_id IS NOT NULL THEN o.delivery_address_id ELSE o.invoice_address_id END;
为什么用OR会出错?
如果写成ON a.id = o.delivery_address_id OR a.id = o.invoice_address_id,当订单的delivery_address_id不为空且和invoice_address_id指向不同地址时,这条订单会匹配到两条地址记录(配送地址+发票地址),完全违背了“优先用配送地址,仅当配送地址为空时才用发票地址”的核心需求——我们需要的是每条订单仅关联一条符合优先级的地址,而不是所有匹配任一条件的地址。
补充说明
因为orders表的invoice_address_id本身无NULL值,所以CASE WHEN里不需要额外判断它的非空性,只要delivery_address_id为NULL时直接使用即可,逻辑简洁且安全。
内容的提问来源于stack exchange,提问作者Robert Soroka
相关产品推荐
相关产品推荐

