Oracle COALESCE 或 NVL
Oracle COALESCE or NVL
我有一个存储过程,我想仅在参数不为空时使用 SYSDATE 更新 table 中的值。
在下面的SQL中,如果pETime IS NULL,我想将SYSENDDATE设置为NULL,否则设置为SYSDATE
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = SYSDATE,
GRD = pGRD,
PASS = v_pass
不确定如何使用 NVL 或 COALESCE 来做到这一点。
nvl2
(是的,"great" 名字,我知道)实际上会方便得多:
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = NVL2(pETime, SYSDATE, NULL)
GRD = pGRD,
PASS = v_pass
正如@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
选项更冗长。但更有可能的是,将来随便一个开发者看到它就能立即明白它在做什么。
您可以使用 NVL2
或 CASE
:
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = CASE
WHEN pETime IS NOT NULL
THEN SYSDATE
ELSE NULL
END,
GRD = pGRD,
PASS = v_pass
我有一个存储过程,我想仅在参数不为空时使用 SYSDATE 更新 table 中的值。
在下面的SQL中,如果pETime IS NULL,我想将SYSENDDATE设置为NULL,否则设置为SYSDATE
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = SYSDATE,
GRD = pGRD,
PASS = v_pass
不确定如何使用 NVL 或 COALESCE 来做到这一点。
nvl2
(是的,"great" 名字,我知道)实际上会方便得多:
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = NVL2(pETime, SYSDATE, NULL)
GRD = pGRD,
PASS = v_pass
正如@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
选项更冗长。但更有可能的是,将来随便一个开发者看到它就能立即明白它在做什么。
您可以使用 NVL2
或 CASE
:
UPDATE OLCACT SET
ENDDATE = pETime,
SYSENDDATE = CASE
WHEN pETime IS NOT NULL
THEN SYSDATE
ELSE NULL
END,
GRD = pGRD,
PASS = v_pass