SQL select *, но переопределяет 'значение столбца' строки, если присутствует в другой таблице - PullRequest
0 голосов
/ 27 ноября 2018

Для простоты, скажем, у меня есть две таблицы с одинаковыми строками.

Пользователь с полями «id» и «name».И user_override с полями "id" и "name"

Я хочу запустить оператор Select, который выберет все значения из User и переопределит любое значение, если оно присутствует в UserOverride

что-то вроде (очевиднотерпит неудачу - COALESCE не принимает au. * в качестве аргумента)

SELECT COALESCE(uo.*, u.*) FROM USER u LEFT JOIN USER_OVERRIDE uo ON u.id = uo.id

, и результатом будет что-то вроде

id | name
1  | 'normal name 1'
2  | 'overriden name 2'
3  | 'normal name 3

Я бы сделал это просто переопределив каждое значение, но это будетв функции, и я бы предпочел не менять его каждый раз и просто повторно использовать один и тот же запрос.

Гарантируется, что эти две таблицы имеют одинаковые столбцы.

Возможно ли что-то подобное?Какой будет синтаксис?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Выражения возвращают только одно значение.Вы можете сделать:

select u.id, coalesce(uo.name, u.name) as name
from user u left join
     user_override uo
     on uo.id = u.id;

Если все значения переопределяются в любой строке, вы можете сделать:

select uo.id, uo.name
from user_override uo
union all
select u.id, u.name
from user u
where not exists (select 1 from user u where u.id = uo.id);
0 голосов
/ 27 ноября 2018

Вам нужно выбрать из обеих таблиц с различными условиями и объединить с UNION:

SELECT u.id, u.name
FROM user u
WHERE NOT EXISTS (SELECT 1 FROM user u WHERE u.id = uo.id)
UNION 
SELECT uo.id, uo.name
FROM user_override uo
WHERE EXISTS (SELECT 1 FROM user u WHERE u.id = uo.id)
0 голосов
/ 27 ноября 2018

Вы находитесь рядом с ответом:

SELECT  u.id ,COALESCE(uo.Name, u.name) as name_New
FROM USER u 
LEFT JOIN USER_OVERRIDE uo ON u.id = uo.id

Вы просто не можете объединить все с одной инструкцией.

Это потому, что Coalesce (проверьте ref: coalesce )

Оценивает аргументы по порядку и возвращает текущее значение первого выражения, которое изначально не оценивается как NULL

Таким образом, вы должны вычислять каждый отдельный столбец отдельный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...