在select中的不同列中查找最小日期,但不是null

时间:2016-01-19 11:33:10

标签: sql date teradata

我有一个Teradata SQL查询,其中有几个不同的日期字段,可以为NULL。 我想找到最早/最低的日期,并且只有在所有日期都为NULL时才返回NULL。

我尝试了LEAST函数,但只要任何日期为NULL就返回NULL,因为它被认为是此函数的最低值。

我现在快速解决的问题是将日期COALESCE改为'9999-12-31',然后使用非常难看的CASE语句将'9999-12-31'替换为NULL,如果这是LEAST函数的结果。< / p>

我现在的代码的最小例子:

CASE WHEN 
LEAST(
COALESCE(date1, date '9999-12-31')(INTEGER),
COALESCE(date2, date '9999-12-31')(INTEGER)
) = '9999-12-31' THEN NULL
ELSE
LEAST(
COALESCE(date1, date '9999-12-31')(INTEGER),
COALESCE(date2, date '9999-12-31')(INTEGER)
)(DATE) 
END

我希望它像:

LEAST_WITHOUT_NULL(date1,date2)

并且只有在两个日期都为NULL的情况下才返回最早的日期和NULL。

我希望有人可以建议更好的功能,甚至更好的方法来重写它。

2 个答案:

答案 0 :(得分:2)

您只能将CASE简化为NULLIF:

NULLIF(LEAST(COALESCE(date1, DATE '9999-12-31')(INTEGER),
             COALESCE(date2, DATE '9999-12-31')(INTEGER)), DATE '9999-12-31') (DATE)

现在它主要是用于添加其他列的剪切和粘贴。当然,如果GREATEST / LEAST允许DATE和/或某种IGNORE NULLS选项,这将更容易。

答案 1 :(得分:1)

对于两个日期,您可以使用以下表达式:

least(coalesce(date1, date2), coalesce(date2, date1))

这很容易扩展到三个日期:

least(coalesce(date1, date2, date3),
      coalesce(date2, date1, date3),
      coalesce(date3, date2, date1))