0

これはかなり頻繁に尋ねられる質問であることは知っていますが、それでも、これを行う方法について知りたい.

名前テーブルから firstname、middlename、lastname の 3 つの値を更新しようとしています。emplid は、ステージング テーブルから選択されます。これにNVLを設定する方法について知りたいです。

クエリ ブロックは次のようになります。

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

ミドルネームが null の場合があるため、null 値を確認したい。

パート 2: 現時点では回避策がありますが、パフォーマンスが影響を受けているため、より良い手法を知りたいと考えています。

今のところ、次の更新クエリを使用しています。

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

これよりも優れたテクニックはありますか?

私はcoalesceオラクルで関数をチェックしましたが、それは結果全体をチェックし、パラメータのいずれかがnullの場合にのみ、null値が返されます。ここでは、個々のフィールドの null 値を確認する必要があります。

ご指導ありがとうございます。

4

2 に答える 2

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

PS、NVL() を使用しないでください。多くの潜在的な落とし穴がありますが、COALESCE() の方が安全です。

于 2013-11-14T08:39:35.217 に答える