含可为NULL外键的SQL查询:根据关联表NULL字段返回对应值
多条件关联返回值的SQL解决方案
表结构及数据
Root表
| id | name | LinkedId | phone |
|---|---|---|---|
| 1 | Sales | 1 | 214-444-1934 |
| 2 | R&D | NULL | 555-111-1834 |
| 3 | Sales | 2 | 214-222-1734 |
| 4 | Finance | 3 | 817-333-1634 |
| 5 | Sales | NULL | 214-555-1434 |
Linked表
| id | name | code |
|---|---|---|
| 1 | Best1 | qqq |
| 2 | NewTec | NULL |
| 3 | NULL | www |
需求规则
- 若
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
相关产品推荐
相关产品推荐

