使LEAST()函数返回一个非空值

时间:2018-07-12 17:41:21

标签: mysql sql database date

我有5个带有日期的列(col1,col2,col3,col4,col5),其中一些为空或为空。 我需要从所有这些列中找到一个最小日期。

我使用的是“最小”功能,它的工作正常,但是如果我有一列带有日期,而其他列为空,则“最小”将返回给我一个空字段!

如何跳过空字段或空列,仅返回日期!或者我需要在使用最小功能之前检查每一列是否为空! 谢谢!

select id, least(vi_date1, vi_date2,vi_date3,vi_date4,vi_date5) as "Min Date", vi_date1, vi_date2,vi_date3,vi_date4,vi_date5 from table

2 个答案:

答案 0 :(得分:1)

使用COALESCE函数忽略NULL

更新-包括最小和最大日期-还要检查空日期或空日期

  select Id, least(COALESCE(IFNULL(vi_date1,''), '9999-12-31 23:59:59') , 
                   COALESCE(IFNULL(vi_date2,''),'9999-12-31 23:59:59'),
                   COALESCE(IFNULL(vi_date3,''),'9999-12-31 23:59:59'),
                   COALESCE(IFNULL(vi_date4,''),'9999-12-31 23:59:59'),
                   COALESCE(IFNULL(vi_date5,''),'9999-12-31 23:59:59')) as "Min Date", 
          , GREATEST(COALESCE(IFNULL(vi_date1,''), '1000-01-01 00:00:00') , 
                   COALESCE(IFNULL(vi_date2,''),'1000-01-01 00:00:00'),
                   COALESCE(IFNULL(vi_date3,''),'1000-01-01 00:00:00'),
                   COALESCE(IFNULL(vi_date4,''),'1000-01-01 00:00:00'),
                   COALESCE(IFNULL(vi_date5,''),'1000-01-01 00:00:00')) as "Max Date", 
          vi_date1, vi_date2,vi_date3,vi_date4,vi_date5 
          vi_date1, vi_date2,vi_date3,vi_date4,vi_date5 
 from table

答案 1 :(得分:1)

只需使用IF(col <> '', col, '...')将NULL和空字符串转换为大(或小)值,然后使用LEAST(或GREATEST)函数:

SELECT
    NULLIF(LEAST(
        IF(vi_date1 <> '', vi_date1, '9999-12-31'),
        IF(vi_date2 <> '', vi_date2, '9999-12-31'),
        IF(vi_date3 <> '', vi_date3, '9999-12-31'),
        IF(vi_date4 <> '', vi_date4, '9999-12-31'),
        IF(vi_date5 <> '', vi_date5, '9999-12-31')
    ),'9999-12-31') AS Min_Date,
    NULLIF(GREATEST(
        IF(vi_date1 <> '', vi_date1, '1000-01-01'),
        IF(vi_date2 <> '', vi_date2, '1000-01-01'),
        IF(vi_date3 <> '', vi_date3, '1000-01-01'),
        IF(vi_date4 <> '', vi_date4, '1000-01-01'),
        IF(vi_date5 <> '', vi_date5, '1000-01-01')
    ),'1000-01-01') AS Max_Date,
    vi_date1,
    vi_date2,
    vi_date3,
    vi_date4,
    vi_date5
FROM testdata

DB Fiddle