SQL选择*,但是如果存在于另一个表中,则覆盖行的“列值”

时间:2018-11-27 11:56:49

标签: sql postgresql

为简单起见,假设我有两个表具有相同的行。

具有字段“ 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

我可以通过简单地覆盖每个值来做到这一点,但是它将在函数中使用,我宁愿不要每次都更改它,而只是重复使用相同的查询。

保证这两个表具有相同的列。

像这样可能吗?语法是什么?

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)