我有一个存储过程,只有当参数为NOT NULL时,我才想用SYSDATE更新表中的值。
在下面的SQL中,如果pETime IS为NULL,我想将SYSENDDATE设置为NULL,否则为SYSDATE
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = SYSDATE,
GRD = pGRD,
PASS = v_pass
不确定如何使用NVL或COALESCE来执行此操作。
答案 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)
您可以使用NVL2
或CASE
:
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = CASE
WHEN pETime IS NOT NULL
THEN SYSDATE
ELSE NULL
END,
GRD = pGRD,
PASS = v_pass