postgresql 对值为NOT NULL的列执行LEFT JOIN,否则对另一列执行联接[已关闭]

rsaldnfx  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(2)|浏览(128)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

31分钟前关门了。
截至28分钟前,机构群体正在审核是否重新讨论此问题。
Improve this question

  • 连接2个表(订单、地址)
  • 订单包含delivery_address_id(包含NULL值)和invoice_address_id(不包含NULL值)列
  • 地址包含ID列(不包含NULL值)

LEFT JOIN主要必须在orders.delivery_address_id上执行。但是,如果该行中的值为NULL,请在orders.invoice_address_id上执行LEFT JOIN。
我该怎么处理这件事?
我尝试了运算符OR,但结果不正确。我还考虑了CASE WHEN语句。我的期望是让LEFT JOIN工作。

dz6r00yl

dz6r00yl1#

您可以在ON子句中使用运算子OR

SELECT ....
FROM Orders o LEFT JOIN Addresses a
ON a.id = o.delivery_address_id 
OR (o.delivery_address_id IS NULL AND a.id = o.invoice_address_id);

或者,使用COALESCE()

SELECT ....
FROM Orders o LEFT JOIN Addresses a
ON a.id = COALESCE(o.delivery_address_id, o.invoice_address_id);
d4so4syb

d4so4syb2#

所以,你想在delivery_address_id上加入,但有时它是NULL,所以你需要invoice_address_id作为后备。
这些情况是COALESCE函数真正发挥作用的地方。如果不是NULLCOALESCE(delivery_address_id, invoice_address_id)将解析为交货地址ID,否则将解析为发票地址ID。
这样我们就可以实现您想要的联接:

SELECT
        orders.some_field,
        addresses.address
      FROM
        orders
 LEFT JOIN
        addresses
        ON
        COALESCE(orders.delivery_address_id, orders.invoice_address_id) = addresses.id

相关问题