Oracle COALESCE或NVL

时间:2015-09-22 21:17:49

标签: sql oracle sql-update coalesce

我有一个存储过程,只有当参数为NOT NULL时,我才想用SYSDATE更新表中的值。

在下面的SQL中,如果pETime IS为NULL,我想将SYSENDDATE设置为NULL,否则为SYSDATE

UPDATE OLCACT SET 
    ENDDATE    = pETime, 
    SYSENDDATE = SYSDATE, 
    GRD        = pGRD,
    PASS       = v_pass

不确定如何使用NVL或COALESCE来执行此操作。

3 个答案:

答案 0 :(得分:5)

正如@Mureinik建议的那样,nvl2是完全有效的方法。即使这是一个内置函数,它的名字也不是特别好或众所周知,所以我倾向于避免它。很容易无意中将其视为nvl,或者让某些人无法准确地回忆起该功能的作用。我宁愿使用CASE声明,使我的意图明确

UPDATE OLCACT SET 
    ENDDATE    = pETime, 
    SYSENDDATE = (CASE WHEN pETime IS NOT NULL
                       THEN sysdate
                       ELSE null
                   END)
    GRD        = pGRD,
    PASS       = v_pass

这比nvl2选项更冗长。但是,未来看待它的随机开发人员更有可能立即了解它正在做什么。

答案 1 :(得分:3)

nvl2(是的,"伟大的"名字,我知道)实际上会更方便:

UPDATE OLCACT SET 
    ENDDATE    = pETime, 
    SYSENDDATE = NVL2(pETime, SYSDATE, NULL)
    GRD        = pGRD,
    PASS       = v_pass

答案 2 :(得分:0)

您可以使用NVL2CASE

UPDATE OLCACT SET 
    ENDDATE    = pETime, 
    SYSENDDATE = CASE
                   WHEN pETime IS NOT NULL 
                   THEN SYSDATE
                   ELSE NULL
                   END, 
    GRD        = pGRD,
    PASS       = v_pass