【问题标题】:Find the minimum date, but not null from different columns in a select从选择的不同列中查找最小日期,但不为空
【发布时间】:2016-04-24 20:41:59
【问题描述】:

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

我尝试了 LEAST 函数,但只要任何日期为 NULL,它就会返回 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 的情况下才返回最早的日期和 NULL。

我希望有人能提出一个更好的函数,甚至是更好的重写方法。

【问题讨论】:

    标签: sql date teradata


    【解决方案1】:

    您只能将 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 选项,这会更容易。

    【讨论】:

    • 谢谢,至少我比我现在的代码更漂亮:)
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢,可悲的是我有超过 2 个 :) 这对于 2 个来说看起来非常好,但对于 3 个或更多来说就不太好。
    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2014-07-26
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多