我知道这是一个经常提出的问题,但仍然想知道如何去做。
我正在尝试更新名称表中的三个值,firstname,middlename,lastname。从登台表中选择emplid。我想知道如何为此设置NVL。
查询块将如下所示:
update staging_table
set firstname, middlename,lastname =
(select firstname,middlename,last
from names
where names.emplid = staging_table.emplid)
我想检查空值,因为有些情况是middlename为null。
第二部分:到目前为止,我已经解决了这个问题,但是,当性能受到影响时,我想知道更好的技术。
截至目前,我已使用此更新查询:
update staging_table set first_name = nvl((select first_name from names where emplid = staging_table.emplid),' ')
update staging_table set middle_name = nvl((select middle_name from names where emplid = staging_table.emplid),' ')
有没有比这更好的技术?
我在oracle中检查了coalesce
函数,但检查了整个结果,如果任何一个参数为null,则只返回null值。在这里,我需要检查各个字段的空值。
感谢您的指导。
答案 0 :(得分:3)
如果中间名为null,则它将在临时表中更新为NULL。你没有直接将NULL与另一个值进行比较,因此没有什么可以“失败”。
如果您将UPDATE更改为以下内容,则可能需要使用NVL()或COALESCE()才能更新所有内容:
update staging_table
set (firstname, middlename, lastname)
= ( select firstname, middlename, last
from names
where names.emplid = staging_table.emplid
and names.middlename = staging_table.middlename
)
但是,您没有最后一行and names.middlename = staging_table.middlename
,因此不适用。
如果您将其作为MERGE代替:
,可能会更清楚merge into staging_table s
using ( select emplid, firstname, middlename, last
from names
) n
on (s.emplid = n.emplid)
when matched then
update
set s.firstname = n.firstname
, s.middlename = n.middlename
, s.lastname = n.last
P.S。,Don't use NVL();它有很多潜在的陷阱,COALESCE()更安全。
答案 1 :(得分:0)
可能这可能是答案:
update staging_table
set (firstname, middlename,lastname) =
(select NVL(firstname , staging_table.firstname),
NVL(middlename, staging_table.middlename),
NVL(last , staging_table.lastname)
from names
where names.emplid = staging_table.emplid)