2012-07-06 59 views
2

我有一个表如下:检查空的一种功能

user_id value1 value2 value3 value4 
1  2  3  4  null 
2  null 5  2  null 
3  null null 100 3 
... 

现在我想要得到的最低值1,值2,值3和值4,然后用最高的最低回报USER_ID。

我想过使用least然后按降序分组,但是如何有效检查null? 该表的输出将是:

user_id value 
3  3 
1  2 
2  2 
+1

显示您的查询 – diEcho 2012-07-06 08:34:21

+0

您可以使用'isnull(value1,0)' – alfasin 2012-07-06 08:34:58

+0

@alfasin:不,你不能。 MySQL ['ISNULL'](http://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#function_isnull“ISNULL(MySQL)”)完全不同于['COALESCE'](http ://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#function_coalesce“COALESCE(MySQL)”),它只接受1个参数并表示它是否为NULL。您必须考虑SQL Server ['ISNULL'](http://msdn.microsoft.com/zh-cn/library/ms184325.aspx“ISNULL(Transact-SQL)”)。 SQL Server'ISNULL'≈MySQL ['IFNULL'](http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html#function_ifnull“IFNULL(MySQL)”) – 2012-07-06 09:16:33

回答

3

~0>>1会给你在mysql的最大BigInt有值(应该是足够了)

coalesce(
     nullif(
      least(coalesce(value1, ~0>>1), coalesce(value2, ~0>>1), 
       coalesce(value3, ~0>>1), coalesce(value4, ~0>>1)), 
     ~0>>1), 
0) 

或你所要做的组合(我把所有这些,不知道这是必要的)

coalesce 
    (least(
     coalesce(value1, value2, value3, value4), 
     coalesce(value1, value2, value4, value3), 
     coalesce(value1, value3, value2, value4), 
     coalesce(value1, value3, value4, value2), 
     coalesce(value1, value4, value2, value3), 
     coalesce(value1, value4, value3, value2), 
     coalesce(value2, value1, value3, value4), 
     coalesce(value2, value1, value4, value3), 
     coalesce(value2, value3, value1, value4), 
     coalesce(value2, value3, value4, value1), 
     coalesce(value2, value4, value1, value3), 
     coalesce(value2, value4, value3, value1), 
     coalesce(value3, value1, value2, value4), 
     coalesce(value3, value1, value4, value2), 
     coalesce(value3, value2, value1, value4), 
     coalesce(value3, value2, value4, value1), 
     coalesce(value3, value4, value1, value2), 
     coalesce(value3, value4, value2, value1), 
     coalesce(value4, value1, value2, value3), 
     coalesce(value4, value1, value3, value2), 
     coalesce(value4, value2, value1, value3), 
     coalesce(value4, value2, value3, value1), 
     coalesce(value4, value3, value1, value2), 
     coalesce(value4, value3, value2, value1) 
) 

,0)

+0

@TerryUhlang编辑:事情最后一个是最正确的。 – 2012-07-06 09:19:46

+0

要将'9999'“变换”回NULL,可以使用'nullif(least(coalesce(value1,9999),...),9999)'。 – 2012-07-06 09:20:14

+0

@AndriyM对。我应该这样做。但是这个解决方案无论如何都是相当糟糕 – 2012-07-06 09:21:42

1

使用COALESCE()它返回第一个非空参数

SELECT COALESCE(LEAST(`value1`,`value2`,`value3`),0) AS min ... 
+1

你不需要有合并价值吗?像:coalesce(至少(...),otherValue)?或者如果没有给定价值,它会做什么?是否有可能只输出分钟,如果分钟,可以说,大于5? – 2012-07-06 08:43:41

1

如果您有任何的参数least()NULL,那么整个结果将是NULL。你的情况,你可以很容易地转换NULL结果到零(0),这似乎是至少一个:

SELECT coalesce(least(value1, value2, value3, value4), 0) 
    FROM table; 

如果你想对你的领域有不同的默认,然后你需要用他们到单独的coalesce()电话:

SELECT coalesce(least(value1, coalesce(value2, 2), value3, value4), 0) 
    FROM table; 

我使用coalesce()代替isnull(),因为它更便于携带。

+0

+1有关不同默认值的有趣想法。 – 2012-07-06 09:29:39