使用 CASE 条件作为结果值

Posted

技术标签:

【中文标题】使用 CASE 条件作为结果值【英文标题】:Use CASE condition as result value 【发布时间】:2014-10-30 08:42:46 【问题描述】:

我想从一组字段中获取最大值,但其中一些字段可以为 NULL,因此我不能按原样使用 GREATEST,我必须将 NULL 值转换为任意值(在这种情况下为 -1) .但是在结果中,如果所有字段都是 NULL,我仍然必须获得 NULL 值。

SELECT 
CASE WHEN GREATEST(IFNULL(f1, -1), IFNULL(f2, -1)) = -1 THEN 
   NULL 
ELSE 
   GREATEST(IFNULL(f1, -1), IFNULL(f2, -1)) 
END

我的问题是,我计算的最大值是两倍,所以我想知道是否有一种方法可以“存储”该值,以便 mysql 不必计算两次。

或者如果有更好/更合适的方法来做我想做的事。

谢谢。

【问题讨论】:

我认为 MySQL 可以判断出您正在计算两次相同的东西,并将其存储在内部。 @Barmar:如果 mysql 是这种情况,我会感到非常惊讶,特别是要记住,oracle 中没有类似于 DETERMENISTIC 的东西 @zerkms 见***.com/questions/23824505/… @Barmar:我认为这些案例并不相似。如果 mysql 不能告诉一个函数是 DETERMENISTIC - 那么在同一个表达式中缓存它的值就太冒险了 @Barmar PS:select case sleep(1) when 1 then 2 else sleep(1) end 在 sqlfiddle 上执行 2 秒 【参考方案1】:

你可以使用NULLIF函数:

NULLIF(GREATEST(IFNULL(f1, -1), IFNULL(f2, -1)), -1)

如果它们相等,它将返回NULL,否则返回第一个参数的值。

参考资料:

http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html#function_nullif

【讨论】:

以上是关于使用 CASE 条件作为结果值的主要内容,如果未能解决你的问题,请参考以下文章

存储过程里面的CASE,WHEN,THEN的用法

没有值时带有 CASE 的 SQL 语句

具有一个条件和多个结果的 SQL CASE

oracle中case when使用

条件判断函数-CASE WHEN、IF、IFNULL详解

SQL中关键字Case的使用