我将如何更改此更新语句,以便如果在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');
我将如何更改此更新语句,以便如果在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');
我认为这应该工作。
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');
即时获取第2行错误:缺少SET关键字 –
@NedKhivju我做了一个改变,你可以检查它吗? – RRK
可以使用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');
从这个问题,我认为你有两种情况。
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'
);
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'
);
你的意思'NEW_VALUE'场是'null'或没有相应的行''GENDERSPELLING存在? – zarruq
select decode(new_value,null,'U',new_value)... – Frank
没有对应的行存在@zarruq –