为简单起见,假设我有两个表具有相同的行。
具有字段“ id”和“名称”的用户。以及带有字段“ id”和“ name”的user_override
我想运行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
我可以通过简单地覆盖每个值来做到这一点,但是它将在函数中使用,我宁愿不要每次都更改它,而只是重复使用相同的查询。
保证这两个表具有相同的列。
像这样可能吗?语法是什么?
答案 0 :(得分:2)
您最接近答案的地方
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)
按顺序评估参数并返回参数的当前值 最初不计算为NULL的第一个表达式
因此,您必须评估单独
中的每一列答案 1 :(得分:0)
表达式仅返回单个值。您可以做:
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);
答案 2 :(得分:0)
您需要从两个条件不同的表中进行选择,并与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)