从 select 中的不同列中查找最小日期,但不为空

Find the minimum date, but not null from different columns in a select

我有一个 Teradata SQL 查询,其中包含几个可以为 NULL 的不同日期字段。 我想找到 earliest/lowest 日期,并且仅当所有日期都为 NULL 时才找到 return NULL。

我尝试了 LEAST 函数,但是只要任何日期为 NULL,returns NULL,因为它被该函数认为是最低的。

我现在的快速解决方法是将日期合并为“9999-12-31”,然后使用非常难看的 CASE 语句将“9999-12-31”替换为 NULL(如果这是 LEAST 函数的结果) .

现在我的代码的一个最小示例:

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 的情况下才 return 最早日期和 NULL。

我希望有人能提出更好的功能,或者更好的重写方法。

对于两个日期,你可以使用这个表达式:

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

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

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

您只能将 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 允许日期 and/or 一种 IGNORE NULLS 选项,这会更容易。