2017-10-20 201 views
0

我将如何更改此更新语句,以便如果在GENDERSPELLING表中找不到该值,那么GENDER将设置为'U'?更改更新语句SQL

UPDATE DWCUST DW 
SET GENDER = (SELECT NEW_VALUE FROM GENDERSPELLING GS 
       WHERE DW.GENDER = GS.INVALID_VALUE) 
WHERE GENDER NOT IN ('M', 'F'); 
+0

你的意思'NEW_VALUE'场是'null'或没有相应的行''GENDERSPELLING存在? – zarruq

+0

select decode(new_value,null,'U',new_value)... – Frank

+0

没有对应的行存在@zarruq –

回答

0

我认为这应该工作。

UPDATE DWCUST DW 
SET GENDER = (
    SELECT CASE WHEN MAX(NEW_VALUE) IS NULL 
      THEN 'U' 
      ELSE MAX(NEW_VALUE) 
      END 
    FROM GENDERSPELLING GS 
    WHERE DW.GENDER = GS.INVALID_VALUE 
) 
WHERE GENDER NOT IN ('M', 'F'); 
+0

即时获取第2行错误:缺少SET关键字 –

+0

@NedKhivju我做了一个改变,你可以检查它吗? – RRK

0

可以使用COALESCE(或Oracle的NVL)打开NULL'U'

update dwcust dw 
set gender = 
    nvl((select new_value from genderspelling gs where dw.gender = gs.invalid_value), 'U') 
where gender not in ('M', 'F'); 
0

从这个问题,我认为你有两种情况。

NEW_VALUE列数据为空:使用COALESCE

UPDATE DWCUST DW 
SET GENDER = (
     SELECT coalesce(NEW_VALUE, 'U') 
     FROM GENDERSPELLING GS 
     WHERE DW.GENDER = GS.INVALID_VALUE 
     ) 
WHERE GENDER NOT IN (
     'M' 
     ,'F' 
     ); 

DEMO

CORRELATED sub-Query无返回值:使用扩展CASE

UPDATE DWCUST DW 
SET GENDER = CASE 
     WHEN (
       SELECT NEW_VALUE 
       FROM GENDERSPELLING GS 
       WHERE DW.GENDER = GS.INVALID_VALUE 
       ) IS NULL 
      THEN 'U' 
     ELSE (
       SELECT NEW_VALUE 
       FROM GENDERSPELLING GS 
       WHERE DW.GENDER = GS.INVALID_VALUE 
       ) 
     END 
WHERE GENDER NOT IN (
     'M' 
     ,'F' 
     ); 

OR COALESCE外:

UPDATE DWCUST DW 
SET GENDER = coalesce((
      SELECT NEW_VALUE 
      FROM GENDERSPELLING GS 
      WHERE DW.GENDER = GS.INVALID_VALUE 
      ), 'U') 
WHERE GENDER NOT IN (
     'M' 
     ,'F' 
     ); 

DEMO