2013-02-08 112 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