You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含可为NULL外键的SQL查询:根据关联表NULL字段返回对应值

多条件关联返回值的SQL解决方案

表结构及数据

Root表

idnameLinkedIdphone
1Sales1214-444-1934
2R&DNULL555-111-1834
3Sales2214-222-1734
4Finance3817-333-1634
5SalesNULL214-555-1434

Linked表

idnamecode
1Best1qqq
2NewTecNULL
3NULLwww

需求规则

  • 若root.LinkedId为NULL,返回空字符串;
  • 若root.LinkedId关联Linked表行:
    • 若Linked.code为NULL,仅返回Linked.name;若Linked.name为NULL,无论code值如何均返回空字符串;
    • 若Linked.name和Linked.code均不为NULL,返回两者拼接值。

现有问题

现有SQL语句仅能关联两张表,但无法实现上述多条件逻辑:

select linkedId, name, code
from Linked a
left join root b on b.LinkedId = a.Id
where b.LinkedId is not null

解决方案SQL

使用CASE WHEN语句按优先级处理所有规则,从Root表出发左关联Linked表以保留所有Root记录:

SELECT 
    r.id AS root_id,
    CASE
        -- 规则1:LinkedId为NULL时返回空字符串
        WHEN r.LinkedId IS NULL THEN ''
        -- 规则2:关联行的name为NULL时返回空字符串
        WHEN l.name IS NULL THEN ''
        -- 规则2:关联行的code为NULL时仅返回name
        WHEN l.code IS NULL THEN l.name
        -- 规则2:name和code都不为NULL时拼接返回
        ELSE CONCAT(l.name, ' ', l.code)
    END AS result
FROM Root r
LEFT JOIN Linked l ON r.LinkedId = l.id;

验证结果

执行上述SQL后,各root.id对应的返回值如下:

  • root.id=1:返回Best1 qqq(name和code均非空,拼接结果)
  • root.id=2:返回``(LinkedId为NULL)
  • root.id=3:返回NewTec(code为NULL,仅返回name)
  • root.id=4:返回``(关联行的name为NULL)
  • root.id=5:返回``(LinkedId为NULL)

内容的提问来源于stack exchange,提问作者PathJim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:55:19