假设我有表 a(列 a1)和 b(列 b1 和 b2)并且我执行左外连接
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Run Code Online (Sandbox Code Playgroud)
然后 b1 和 b2 将为 NULL,其中 a1 的值没有 b1 的匹配值。
我可以为 b2 提供默认值而不是 NULL 吗?需要注意的是COALESCE不会在这里工作,因为我不希望默认值来覆盖潜在的NULL在B2那里是B1匹配A1的值。
也就是说,将 a 和 b 作为
CREATE TABLE a (a1)
AS VALUES (1),
(2),
(3) ;
CREATE TABLE b (b1,b2)
AS VALUES (1, 10),
(3, null) ;
a1 b1 | b2
--- --------
1 1 | 10
2 3 | NULL
3
Run Code Online (Sandbox Code Playgroud)
和 b2 的默认值,比如 100,我想得到结果
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
Run Code Online (Sandbox Code Playgroud)
在这个简单的例子中,我可以通过查看输出中的 b1 是否为 NULL 来“手动”完成。一般来说,这是最好的选择,还是有更标准和更整洁的方法?
Mor*_*hai 31
SELECT a.a1,b.b1,
CASE WHEN b.b1 is NULL THEN 5 ELSE b.b2 END AS b2
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Run Code Online (Sandbox Code Playgroud)
Rob*_*Rob 11
我发现 COALESCE 在这种情况下非常有用。它将从列表中返回第一个非 NULL 值:
SELECT
a.a1,
b.b1,
COALESCE (b.b2, 100) AS b2
FROM a
LEFT OUTER JOIN b
ON (a.a1 = b.b1);
Run Code Online (Sandbox Code Playgroud)
在@ypercube 正确识别出我的答案与问题不匹配的问题之后。这是他的更正:
SELECT
a.a1,
b.b1,
COALESCE(b.b2, d.b2) AS b2
FROM a LEFT JOIN b ON a.a1 = b.b1
LEFT JOIN (SELECT 100 AS b2) AS d ON b.b1 IS NULL;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66789 次 |
| 最近记录: |