我有一个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。
我希望有人可以建议更好的功能,甚至更好的方法来重写它。
答案 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))