SQL多列比较获取最小值异常:四列取min返回NULL
解决多列取最小值返回NULL的问题
为啥用CASE会返回NULL?
大概率是CASE的逻辑没覆盖全所有情况,或者某几列有NULL值——因为NULL和任何值比较结果都是未知,CASE里的条件不成立,最后就走到默认的ELSE NULL了。
靠谱的解决办法
方法1:用LEAST()函数(推荐,简单省事)
常用数据库比如MySQL、PostgreSQL、SQLite都支持这个函数,直接把四个日期列传进去就能拿到最小值。要是列里有NULL,记得用COALESCE()把NULL换成一个超大的日期(比如'9999-12-31'),这样就不会影响最小值的计算了。
举个例子:
UPDATE 你的表名 SET 最后一列的列名 = LEAST( COALESCE(`Date-1`, '9999-12-31'), COALESCE(`Date-2`, '9999-12-31'), COALESCE(`Date-3`, '9999-12-31'), COALESCE(`Date-4`, '9999-12-31') );
COALESCE(col, 默认值):如果列是NULL,就用后面的默认值顶上去,这里用最大的日期,保证它不会成为最小值。LEAST():直接返回传进去的几个值里最小的那个。
方法2:改好你的CASE语句
要是非得用CASE,就得把所有可能的大小情况都覆盖到,同时处理NULL:
UPDATE 你的表名 SET 最后一列的列名 = CASE WHEN `Date-1` <= COALESCE(`Date-2`, '9999-12-31') AND `Date-1` <= COALESCE(`Date-3`, '9999-12-31') AND `Date-1` <= COALESCE(`Date-4`, '9999-12-31') THEN `Date-1` WHEN `Date-2` <= COALESCE(`Date-3`, '9999-12-31') AND `Date-2` <= COALESCE(`Date-4`, '9999-12-31') THEN `Date-2` WHEN `Date-3` <= COALESCE(`Date-4`, '9999-12-31') THEN `Date-3` ELSE `Date-4` END;
不过这种写法太啰嗦了,不如LEAST()好用,除非你的数据库不支持这个函数。
额外提醒
- 确保四个Date列都是DATE或者DATETIME类型,别混着字符串类型,不然比较会出错。
- 要是四个列全是NULL,
LEAST()会返回NULL,你可以再套一层COALESCE()给个默认值,比如COALESCE(LEAST(...), '1900-01-01')。
内容的提问来源于stack exchange,提问作者Bharath Babu
相关产品推荐
相关产品推荐

