0

我知道这是一个经常被问到的问题,但仍然想知道如何去做。

我正在尝试从名称表中更新三个值,名字,中间名,姓氏。emplid 是从临时表中选择的。我想知道如何为此设置NVL。

查询块将如下所示:

update staging_table
set firstname, middlename,lastname =
            (select firstname,middlename,last 
             from names 
             where names.emplid = staging_table.emplid)

我想检查空值,因为在某些情况下中间名是空的。

第二部分:到目前为止,我已经解决了这个问题,但是仍然想知道一种更好的技术,因为性能会受到影响。

截至目前,我已经使用了这个更新查询:

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),' ')

还有比这更好的技术吗?

我已经检查了coalesceoracle 中的函数,但是检查了整个结果,如果任何一个参数为 null,那么只有这样,才会返回 null 值。在这里,我需要检查各个字段的空值。

感谢您的指导。

4

2 回答 2

3

如果中间名为空,那么它将在您的临时表中更新为 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

PS,不要使用 NVL();它有很多潜在的陷阱, COALESCE() 更安全。

于 2013-11-14T08:39:35.217 回答
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)
于 2013-11-14T09:15:37.453 回答