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 选项更冗长。但更有可能的是,将来随便一个开发者看到它就能立即明白它在做什么。

您可以使用 NVL2CASE:

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