2013-02-08 110 views
0

我在我的postgresql数据库中有两个表。 两个表都有相同的列。Postgresql表相交

我该如何偏好tableA中不为null的值?

TableA 
id | name 
1 | val_a_1 
2 | val_a_2 
3 | (null) 

TableB 
id | name 
1 | (null) 
2 | val_b_2 
3 | val_b_3 

结果,我想:

id | name 
1 | val_a_1 
2 | val_a_2 
3 | val_b_3 

现在我知道了这个样子,但它更复杂,因为有很多列。

SELECT * 
CASE 
WHEN TableA.name is NULL or TableA.name = '' 
THEN (SELECT TableB.name FROM TableB where TableB.id = 1) 
ELSE TableA.name 
END 
AS name, 
CASE 
. 
. another columns 
. 
END 

感谢

回答

2

为什么不使用COALESCE假设在表A所有的recordId存在于表2

SELECT a.ID, 
     COALESCE(a.name, b.name) AS "Name" 
FROM TableA a 
     INNER JOIN TableB b 
      ON a.ID = b.ID 

的COALESCE函数返回第一个的其参数(可以有更多参数)不为空。

这一切都是关于COALESCE,而不是连接本身。

+0

好了,我们已经获得了一些并发症这里。我们想要选择的数据彼此独立,并且在您的案例中没有任何共同点/像ID。而且,我们有大约25列,所以“合并(a.name,b.name)AS名称”对于每一列都是有压力的:)如果你明白了 - 我在tableA中有一个唯一的行, tableB中的一个唯一行,以及我想要“合并”的这两个选定行。喜欢,合并,但在两个选定的行之间。当时我们已经有了案例,但它也非常有压力,如果你知道我的意思:) – anti 2013-02-08 15:21:00

1

你可以使用全外连接存在于表A,但没有TableB中的值,反之亦然:

select coalesce(tableA.ID, tableB.ID) as ID, 
coalesce(tableA.Name, tableB.Name) as Name 
from tableA full outer join tableB on tableA.ID = tableB.ID