2013-02-08 2 views
0

У меня есть две таблицы в моей базе данных postgresql. Обе таблицы имеют одинаковые столбцы.Таблицы Postgresql пересекаются

Как я могу выбрать значения из таблицы A, которые не являются нулевыми?

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? Предполагая, что все RecordId в TABLEA присутствует на Table2

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 столбцов, так что «coalesce (a.name, b.name) AS name» для каждого столбца будет стрессовым :) Если вы понимаете - у меня есть одна уникальная строка в таблице A и одна уникальная строка в таблицеB, и эти две выбранные строки я хочу «объединить». Как, сливаются, но между двумя выбранными рядами. У нас есть случай, когда тогда, но это тоже очень напряженный, если вы знаете, что я имею в виду :) – anti

1

вы можете использовать полное внешнее соединение для значений, которые существуют в TABLEA, но не в 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 
Смежные вопросы