最大的非空列

16

我需要根据两个DATETIME列的最大值来使用公式更新一行数据。通常我会这样做:

GREATEST(date_one, date_two)

然而,两列都可以为NULL。我需要在另一列为NULL时得到最大的日期(当两个都为NULL时,我期望得到NULL)。但是GREATEST()在其中一列为NULL时返回NULL似乎不起作用。

这个解决方案似乎可行:

GREATEST(COALESCE(date_one, date_two), COALESCE(date_two, date_one))

但是我想知道... 我是否错过了更简单的方法?

2个回答

16

COALESCE(GREATEST(date_one, date_two), date_one, date_two)


太好了!非常感谢。我只希望我永远不需要将其推广到n列... ;-P - Álvaro González
1
好的,但是如果涉及到超过2列怎么办?如果涉及到10列呢? - Nick Perkins
对于n列:COALESCE(GREATEST(date_one, date_two.. date_n), date_one, date_two, .. date_n) - Sanjay Verma
@SanjayVerma 你对于n列的概括并不完全正确。如果任何一个日期是NULL,内部调用GREATEST(date_one, date_two, ... date_n)将返回NULL,这将导致外部的COALESCE(GREATEST(...), date_one, date_two, ... date_n)返回第一个列出且不为NULL的日期,而不一定是最大的日期。 - undefined
@NickMuise 好观点! - undefined

1

我对多列的解决方案如下:

SELECT NULLIF(
  GREATEST(
    NVL(NULL,     to_date('01011980','ddmmyyyy')), --COLUMN 1
    NVL(sysdate,  to_date('01011980','ddmmyyyy')), --COLUMN 2
    NVL(NULL,     to_date('01011980','ddmmyyyy')), --COLUMN 3
    NVL(sysdate-1,to_date('01011980','ddmmyyyy'))  --COLUMN 4
  ),to_date('01011980','ddmmyyyy')
) as greatest_date
FROM DUAL;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接