oracle在nvl中选择查询

时间:2017-10-29 09:19:55

标签: sql oracle plsql

我想用页面项vaue更新数据库列。如果页面项为null,那么我想用从sql select query返回的值替换它。

update user 
    set pswd := nvl(:P10_PSWD,select pswd from user where uname=:P10_UNAME), utype=:P10_UTYPE  where uname=:P10_UNAME;

我想更新column-utype和paswd。如果item:P10_PSWD为null,那么我想用现有值和utype更新pswd:P10_UTYPE。怎么做?

4 个答案:

答案 0 :(得分:2)

此UPDATE发出请求的更改:

如果设置了绑定变量,则更新密码,如果绑定变量为NULL,则保留用户的原始密码。

update userw 
    set pswd  =  :P10_PSWD
where  :P10_PSWD is not NULL and uname=:P10_UNAME;

答案 1 :(得分:2)

没有理由使用子查询;如果要使用当前行中列的值,只需使用其名称。

似乎你想要像

这样的东西
update user 
    set pswd = nvl(:P10_PSWD, pswd), utype = :P10_UTYPE  
    where uname=:P10_UNAME;

但是,即使在您进行了更改后,如果您希望在所有情况下都更新utype,或仅在:P10_PSWDNULL时,仍然不清楚。无论如何,上面的UPDATE都会更新utype。如果您只想在:P10_PSWDNULL时更新,则utype的分配应为

 .....  , utype = nvl2(:P10_PSWD, utype, :P10_UTYPE)
 .....

NVL2功能:https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions106.htm

答案 2 :(得分:1)

您的uname=:P10_UNAME条款中有whereNVLUPDATE user SET pswd = NVL(:p10_pswd,pswd), utype = :p10_utype WHERE uname = :p10_uname; 选择,这是不必要的,您只需使用。

AVERAGE()

答案 3 :(得分:1)

如果需要,请确保你也要处理utype值。但是它不会抛出异常而是会更新为null。我会说最好的方法是如果null然后保持现有的。然后再取决于你的要求。

 update user
 set    pswd  = nvl(:P10_PSWD,pswd),
        utype = nvl(:P10_UTYPE,utype)
 where  uname = :P10_UNAME;