我有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
答案 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