我可以为左外连接提供默认值吗?

Tom*_*lis 33 postgresql join

假设我有表 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)

  • 由于您想区分由于 JOIN 而出现的 NULL 和那些“自然”存在的 NULL,因此您不可避免地必须检查 b1。如果这就是您所说的“我可以“手动”完成”,那么是的,那是唯一的方法。 (4认同)
  • 没有解释,我很想对这个投反对票。这个答案不符合 DBA.SE 的质量。 (2认同)

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)

  • 这是迄今为止最好的答案。 (2认同)